青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

eryar

PipeCAD - Plant Piping Design Software.
PlantAssistant - Translate AVEVA RVM/SP3D VUE to glTF, STEP, etc.
posts - 606, comments - 590, trackbacks - 0, articles - 0

C++ 應用程序性能優化

Posted on 2016-07-31 13:44 eryar 閱讀(4973) 評論(4)  編輯 收藏 引用 所屬分類: 2.OpenCASCADE

C++ 應用程序性能優化

eryar@163.com

1. Introduction

對于幾何造型內核OpenCASCADE,由于會涉及到大量的數值算法,如矩陣相關計算,微積分,Newton迭代法解方程,以及非線性優化的一些算法,如BFGS,FRPR,PSO等等用于多元函數的極值求解,所以這些數值算法的性能直接影響系統的性能。軟件的性能優化是計算機軟件開發過程中需要一直關注的重要因素,因此有必要學習下C++應用程序性能優化的方法。

在網上尋找相關資料時,發現這方面的資料也很少,最后發現一本由電子工業出版社出版的《C++應用程序性能優化方法》,從中可以學習下IBM的性能優化方法。

本文主要結合《C++性能優化方法》并結合代碼實例來說明內存優化處理對程序性能的影響。看完本書,其實發現C++性能優化方法主要還是依賴的計算機相關的基礎知識,比如說計算機操作系統,數據結構與算法等等。

2.Memory Optimize

C++程序中的存儲空間可以分為靜態/全局存儲區,棧區和堆區。靜態/全局存儲區和棧區的大小一般在程序編譯階段決定;而堆區則隨著程序的運行而動態變化,每一次程序運行都會有不同的行為。這種動態的內存管理對于一個程序在運行過程中占用的內存大小及程序的性能有非常重要的影響。

因為靜態/全局存儲區在編譯時就已經確定了,而棧區則是由操作系統在管理,這些都不勞程序員費神。就是這個堆區是提供給程序員的自由舞臺,可以任性發揮。堆區的存儲區域怎么玩呢?理解了這三個問題應該就知道了:一是堆區數據怎么產生(從哪兒來)?二是堆區的數據怎么銷毀(到哪兒去)?堆區數據怎么訪問?由C++標準規定得知,C++實現通過全局的new和delete來提供動態內存的訪問和管理。而堆區數據的訪問就是通過指針了。當使用new/delete來操作堆上的存儲區域時,操作系統就要對堆的存儲區域進行管理,所以這個管理工作就會對應用程序的性能有影響。

為了解決內存泄露問題,即new之后不再使用時并沒有delete,OpenCASCADE中入了Handle智能指針的宏定義。Handle的使用也很簡單,只需要將用Handle(Class)就可以了。

利用默認的內存管理new/delete在堆上分配和釋放內存會有一些額外的開銷。系統在接收到一定大小內存請求時,首先查找內部維護的內存空閑塊表,并且需要根據一定的算法(例如分配最先找到的不小于申請大小的內存塊給請求者,或者分配最適于申請大小的內存塊等)找到合適大小的內存塊。如果該空閑內存塊過大,還需要切割成已分配的部分和較小的空閑塊,然后系統更新內存塊表,完成一次內存分配。類似地,在釋放內存時,系統把釋放的內存塊重新加入到空閑內存塊表中。如果有可能的話,可以把相鄰的空閑塊合并成較大的空閑塊。

默認的內存管理函數還考慮到多線程的應用,需要在每次分配和釋放內存時加鎖,同樣增加開銷??梢?,如果應用程序頻繁地在堆上分配格釋放內存,則會導致性能的損失。并且會使系統中出現大量的內存碎片,降低內存的利用率。

由此可見,在簡單的new和delete背后,系統默默地為我們做了這么多的事,而做這些事都是要花時間的?。‰m然默認的內存管理算法也考慮了性能,但是考慮的是更通用的情況,為了應付更復雜、更廣泛的情況,需要做更多額外工作。而對于具體的應用程序來說,適合自身特定的內存管理則可以獲得更好的性能,為此OpenCASCADE引入了自己的內存管理機制,與內存池概念類似。OCCT的內存通過配置,可以使用沒的優化技術,或者不使用任何優化直接使用系統的malloc和free。這些配置都是通過環境變量來實現,其中打開和關閉內存優化的開關是環境變量:MMGT_OPT,這個默認是0,即不使用任何優化;設置成1就是使用;設置成2就是使用TBB的內存優化技術(這個的前提是第三方庫正確配置,如果沒有還是使用的malloc和free;

// paralleling with Intel TBB
#ifdef HAVE_TBB
  #include <tbb/scalable_allocator.h>
  using namespace tbb;
#else
  #define scalable_malloc malloc
  #define scalable_calloc calloc
  #define scalable_realloc realloc
  #define scalable_free free
#endif

下面通過代碼來看看使用內存管理的性能有什么變化。

3.Code Example

下面通過程序來看看使用這些技術對性能的影響:


/*
*    Copyright (c) 2016 Shing Liu All Rights Reserved.
*
*           File : main.cpp
*         Author : Shing Liu(eryar@163.com)
*           Date : 2016-07-31  11:54
*        Version : OpenCASCADE7.0.0
*
*    Description : Test OCCT Memory Manager and Handle(smart pointer).
*/

#include <OSD_Timer.hxx>

#include <Poly.hxx>
#include <Poly_Triangulation.hxx>

#pragma comment(lib, "TKernel.lib")
#pragma comment(lib, "TKMath.lib")

/*
*@brief test memory without Handle(smart pointer) management.
*
 
*/
void testMemory(Standard_Integer theCount)
{
    OSD_Timer aTimer;
    aTimer.Start();

    for (Standard_Integer i = 0; i < theCount; i++)
    {
        Poly_Triangulation* aTriangulation = new Poly_Triangulation(10, 5, Standard_False);

        delete aTriangulation;
    }

    aTimer.Stop();
    aTimer.Show();
}

/*
*@brief test memory with Handle(smart pointer) management.
*
*/
void testHandle(Standard_Integer theCount)
{
    OSD_Timer aTimer;
    aTimer.Start();

    for (Standard_Integer i = 0; i < theCount; i++)
    {
        Handle(Poly_Triangulation) aTriangulation = new Poly_Triangulation(10, 5, Standard_False);
    }

    aTimer.Stop();
    aTimer.Show();
}

/*
* @brief set environment variable MMGT_OPT=0 to use malloc/free directly;
*        set environment varialbe MMGT_OPT=1 to use OCCT memory optimization technique;
*        set environment variable MMGT_OPT=2 to use paralleling with Interl TBB;
 
*/
int main(int argc, char* argv[])
{
    int aCount = 100000;

    std::cout << "\ntest pointer without handle" << std::endl;
    testMemory(aCount);

    std::cout << "\ntest pointer with handle" << std::endl;
    testHandle(aCount);

    return 0;
}

如果直接運行上面的代碼編譯的程序,得到的結果如下圖所示:

wpsECE0.tmp

由圖可知,當使用Handle(智能指針)的時候,時間上影響不大,即使用Handle對性能影響基本上可以忽略,但是得到很多好處,主要的就是不用自己去delete了。使用Visual Studio的性能分析工具查看,結果也類似:

wpsECF1.tmp

時間的開銷也是集中在內存的分配上面:

wpsED02.tmp

注意到上面的Allocate()是類Standard_MMgrRaw的,即是直接使用的系統的malloc和free來管理內存。下面設置環境變量MMGT_OPT=1來使用OCCT的內存優化類看看對性能影響如何?

wpsED03.tmp

程序運行的結果如下圖所示:

wpsED13.tmp

與沒有使用內存優化的時候0.1相比,使用了內存優化處理的要快40%左右。

由下圖可以看出,性能熱點也是集中在內存的分配上面:

wpsED14.tmp

注意現在內存分配使用的是Standard_MMgrOpt類中的Allocate函數:

wpsED15.tmp

總的來說,將環境變量MMGT_OPT設置成1來使用OCCT的內存優化算法,性能提升還是很明顯的。

4.Conclusion

當程序規模越來越大,算法越來算復雜的時候,找到性能的瓶頸越麻煩一些。性能優化第一步是測量,找到合適的測量工具?!禖++應用程序性能優化》一書中提供的是IBM Rational Quantify,在網上搜了下還有Intel VTune Amplifier等,功能都很強大。在Windows中開發程序使用的Visual Studio自帶了性能分析功能,使用起來也比較方便。

找到性能瓶頸,就要對其進行分析原因,進而修改程序,提高性能。這方面的方法論可以借鑒《C++應用程序性能優化》,從數據結構、程序啟動、內存管理等方面來分析。摘出此書中程序性能優化的流程圖:

wpsED16.tmp

5. References

1.馮宏華,徐瑩,程遠,汪磊. C++應用程序性能優化. 電子工業出版社.

2.Scott Meryers. Effective C++(評注版). 電子工業出版社. 2011

3.OpenCASCADE Foundation Classes Document 7.0.0. 2016

Feedback

# re: C++ 應用程序性能優化  回復  更多評論   

2016-08-01 20:44 by ViCross
是否 應該是 在C++的Release下測試 更合適

# re: C++ 應用程序性能優化  回復  更多評論   

2016-08-01 20:57 by eryar
@ViCross
是的,debug和release還是有些區別

# re: C++ 應用程序性能優化  回復  更多評論   

2016-08-02 12:05 by 趙先生
您好,我是某軟件公司的HR,對您提到的三維相關技術感興趣,請查閱您的郵箱: eryar(at)163.com,希望與您取得聯系

# re: C++ 應用程序性能優化  回復  更多評論   

2016-08-02 13:57 by eryar
@趙先生
Hi 趙先生,

您好!

感謝關注,郵件已經回復,請查收。

Best Regards,
Shing Liu
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚欧美中日韩视频| 亚洲制服av| 亚洲国产婷婷香蕉久久久久久99 | 欧美一激情一区二区三区| 亚洲一区综合| 久久精品国产69国产精品亚洲 | 老司机凹凸av亚洲导航| 欧美/亚洲一区| 亚洲高清免费视频| 亚洲精品资源| 午夜精品亚洲一区二区三区嫩草| 欧美一区二区三区四区在线观看| 久久中文字幕一区| 欧美日韩国产色视频| 国产精品视频最多的网站| 国户精品久久久久久久久久久不卡| 在线精品视频在线观看高清| 亚洲精品老司机| 亚洲欧美国产另类| 久久精品一区二区国产| 久久精品99国产精品日本| 欧美成va人片在线观看| 亚洲国产精品t66y| 日韩一区二区精品在线观看| 一本大道久久a久久综合婷婷| 一区二区三区福利| 亚洲图片欧洲图片av| 欧美一区二区三区视频在线观看| 久久精品国产一区二区电影 | 亚洲精品乱码久久久久久蜜桃91 | 91久久精品一区| 亚洲免费观看| 亚洲午夜激情免费视频| 欧美在线www| 欧美高清hd18日本| 国产精品成人国产乱一区| 国产日本欧美一区二区三区在线| 亚洲国产精品国自产拍av秋霞| 一区二区三区高清在线观看| 亚洲欧美电影在线观看| 久久久一区二区| 日韩视频在线免费| 久久都是精品| 欧美日韩视频专区在线播放| 亚洲国产精品毛片| 亚洲欧美日韩国产成人精品影院| 欧美一区视频| 一区二区三区四区五区视频 | 欧美国产精品v| 国产精品久久久久免费a∨| 国产女人18毛片水18精品| 亚洲第一在线综合网站| 宅男精品视频| 欧美成人嫩草网站| 亚洲一级片在线看| 欧美成人久久| 一区二区三区中文在线观看| 这里只有视频精品| 女同一区二区| 羞羞视频在线观看欧美| 欧美视频免费看| 亚洲人成网站在线播| 欧美国产欧美综合| 久久精品噜噜噜成人av农村| 国产乱肥老妇国产一区二| 亚洲国产欧美一区二区三区久久 | 欧美高清自拍一区| 好看的av在线不卡观看| 亚洲欧美日韩国产成人精品影院| 亚洲破处大片| 欧美日韩精品免费| 99re6热在线精品视频播放速度| 麻豆精品一区二区av白丝在线| 欧美亚洲系列| 国产婷婷色一区二区三区四区| 亚洲少妇最新在线视频| 亚洲人成在线观看一区二区| 免费一级欧美片在线观看| 影音先锋另类| 欧美成人激情视频| 久久综合色婷婷| 在线看片日韩| 欧美成人激情视频| 一本一本久久a久久精品综合麻豆 一本一本久久a久久精品牛牛影视 | 国产精品久久久久久久久免费樱桃| 在线视频观看日韩| 女仆av观看一区| 欧美fxxxxxx另类| 亚洲全部视频| 亚洲精品美女久久7777777| 欧美夫妇交换俱乐部在线观看| 亚洲人成网站精品片在线观看| 亚洲第一狼人社区| 久久伊人一区二区| 久久久久成人精品| 欧美国产第一页| aa级大片欧美三级| 亚洲网在线观看| 国产一区二区久久| 能在线观看的日韩av| 欧美高清自拍一区| 精品成人在线观看| 欧美在线日韩| 亚洲午夜一区二区三区| 欧美日韩一区二区视频在线| 一区二区在线视频| 亚洲欧洲一区二区在线播放| 欧美日韩一区二区国产| 亚洲欧美怡红院| 久久精品国产99| 亚洲最新中文字幕| 亚洲欧美另类国产| 在线观看一区二区精品视频| 亚洲人成在线观看| 国产亚洲成精品久久| 欧美激情一区二区三区成人| 国产精品护士白丝一区av| 久久婷婷综合激情| 欧美日韩国产色视频| 久久久99免费视频| 欧美日韩1区| 久久久蜜臀国产一区二区| 美女脱光内衣内裤视频久久影院| 一本色道久久综合亚洲精品高清| 亚洲在线一区二区三区| 激情成人av| 亚洲天堂成人在线观看| 国产乱码精品一区二区三区忘忧草| 亚洲免费观看高清完整版在线观看熊| 欧美国产激情二区三区| 国产精品视频九色porn| 欧美一区1区三区3区公司| 亚洲一区二区精品视频| 久久久一本精品99久久精品66| 一区二区三区四区五区精品| 欧美一区网站| 亚洲黄色大片| 亚洲欧洲日韩综合二区| 国产精品麻豆欧美日韩ww| 久久久成人精品| 久久亚洲国产成人| 香蕉久久精品日日躁夜夜躁| 免费在线观看成人av| 久久精品91久久香蕉加勒比| 欧美日韩一区在线观看视频| 免费亚洲视频| 狠狠色狠狠色综合日日小说| 一本色道久久综合一区| 夜夜精品视频| 欧美女同在线视频| 亚洲二区在线观看| 樱桃国产成人精品视频| 久久精品官网| 蜜桃av一区二区| 久久米奇亚洲| 免费日韩视频| 亚洲国产精品热久久| 狠狠色综合播放一区二区| 国产一区再线| 国产精品午夜视频| 精品盗摄一区二区三区| 国产欧美一区二区三区另类精品| 国产精品电影观看| 欧美大成色www永久网站婷| 久久天堂成人| 亚洲一区精彩视频| 免费在线日韩av| 美女免费视频一区| 国产一区在线播放| 欧美一区二区三区啪啪| 欧美自拍偷拍| 欧美女人交a| 亚洲高清不卡在线| 亚洲高清资源| 美女视频黄 久久| 亚洲欧洲精品一区| av成人毛片| 欧美日韩一区二区三区免费看| 亚洲欧洲日本国产| 一区二区三区导航| 国产免费观看久久| 久久天天躁狠狠躁夜夜爽蜜月| 欧美激情2020午夜免费观看| 国产亚洲精品久久久久婷婷瑜伽| 老司机久久99久久精品播放免费 | 亚洲性线免费观看视频成熟| 欧美精品福利在线| 亚洲毛片av| 午夜免费电影一区在线观看| 暖暖成人免费视频| 夜夜嗨av一区二区三区网页| 99视频精品免费观看| 久久夜色撩人精品| 久久综合九色综合久99| 蜜臀a∨国产成人精品| 噜噜爱69成人精品| 精品成人免费| 国产精品成人一区二区三区吃奶| 性色av香蕉一区二区| 亚洲福利一区|