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

eryar

PipeCAD - Plant Piping Design Software.
RvmTranslator - Translate AVEVA RVM to OBJ, glTF, etc.
posts - 603, comments - 590, trackbacks - 0, articles - 0

C++ 應用程序性能優化

Posted on 2016-07-31 13:44 eryar 閱讀(4957) 評論(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背后,系統默默地為我們做了這么多的事,而做這些事都是要花時間的??!雖然默認的內存管理算法也考慮了性能,但是考慮的是更通用的情況,為了應付更復雜、更廣泛的情況,需要做更多額外工作。而對于具體的應用程序來說,適合自身特定的內存管理則可以獲得更好的性能,為此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>
            亚洲欧洲日本国产| 狠狠入ady亚洲精品| 国内一区二区三区| 国产一区在线视频| 欧美日韩情趣电影| 久久成人一区| 日韩亚洲欧美一区| 免费观看亚洲视频大全| 亚洲一区日韩在线| 亚洲日本激情| 激情校园亚洲| 国产在线视频欧美一区二区三区| 国产一区二区三区视频在线观看| 国产精品久久久久一区| 欧美日韩精品久久| 欧美激情精品久久久| 免费欧美在线视频| 亚洲福利专区| 免费观看成人www动漫视频| 欧美日韩精品免费观看视频完整| 欧美激情第三页| 国产精品一区二区在线观看网站 | 99精品欧美一区二区三区综合在线| 国产精品成人一区二区三区夜夜夜 | 亚洲国产高清视频| 亚洲一区在线直播| 欧美激情a∨在线视频播放| 久久久久国产一区二区| 亚洲一区二区免费看| 在线中文字幕不卡| 性做久久久久久久久| 亚洲国产精品ⅴa在线观看| 久久精品视频一| 久久久国产视频91| 亚洲精品美女| 亚洲女与黑人做爰| 欧美在线日韩在线| 久久久国产一区二区| 久久久久久久尹人综合网亚洲 | 亚洲三级影片| 裸体女人亚洲精品一区| 牛牛国产精品| 激情文学综合丁香| 麻豆精品一区二区av白丝在线| 久久久久久久久伊人| 亚洲视屏在线播放| 久久久久国产精品一区三寸| 国产日韩欧美| 亚洲免费av电影| 午夜激情综合网| 久久黄色小说| 国内精品久久久久影院优| 一区二区三区国产精品| 9l国产精品久久久久麻豆| 欧美性猛交xxxx乱大交蜜桃| 国产精品黄色在线观看| 中文亚洲视频在线| 久久亚洲影音av资源网| 亚洲国产日韩欧美一区二区三区| 久久精品国产2020观看福利| 国内外成人在线| 免费亚洲一区二区| 免费亚洲电影在线| 亚洲特黄一级片| 亚洲一区二区三区四区中文| 另类专区欧美制服同性| 欧美日韩精品二区第二页| 中国成人黄色视屏| 午夜精品网站| 激情久久久久| 亚洲精品国产精品国自产在线| 欧美精品在线免费观看| 在线观看日韩av电影| 亚洲尤物在线| 香蕉精品999视频一区二区| 娇妻被交换粗又大又硬视频欧美| 母乳一区在线观看| 欧美综合国产精品久久丁香| 亚洲福利av| 在线一区亚洲| 欧美日韩另类字幕中文| 午夜精品久久久久久久男人的天堂| 亚洲午夜国产一区99re久久| 国产专区精品视频| 亚洲精品视频在线观看免费| 免费亚洲电影在线观看| 亚洲在线免费视频| 极品尤物av久久免费看| 91久久国产综合久久91精品网站| 国产精品成人播放| 欧美肥婆bbw| 亚洲欧美国产另类| 亚洲精品综合| 久久精品毛片| 亚洲在线视频| 欧美成人黑人xx视频免费观看 | 亚洲伦理在线免费看| 国产区日韩欧美| 亚洲日本中文字幕| 亚洲在线不卡| 亚洲麻豆av| 久久人人爽人人| 亚洲国产精品一区制服丝袜| 99精品免费视频| 亚洲欧美日韩精品| 国产一区二区视频在线观看| 亚洲国产精品传媒在线观看| 国产一区二区三区av电影| 99re热这里只有精品视频| 亚洲国产精品第一区二区| 欧美一区二区免费观在线| 欧美日韩色综合| 久久亚洲精品视频| 国产欧美日韩一区二区三区在线观看| 91久久精品国产91性色tv| 韩国一区电影| 午夜精品久久久久99热蜜桃导演| 99re6热只有精品免费观看| 久久人人97超碰精品888| 久久女同精品一区二区| 久久精品一区二区三区不卡牛牛| 亚洲综合久久久久| 国产精品扒开腿做爽爽爽软件 | 亚洲一区二区三区在线播放| 欧美激情一区二区三区高清视频 | 国产九九视频一区二区三区| 亚洲免费观看高清完整版在线观看熊 | 99亚洲视频| 日韩天天综合| 欧美刺激性大交免费视频| 欧美刺激午夜性久久久久久久| 国产一区二三区| 欧美亚洲一区二区三区| 午夜精品亚洲| 国产午夜精品麻豆| 久久精品最新地址| 欧美成人免费网| 99国产精品久久久久老师 | 一区二区高清视频| 精品福利电影| 久久婷婷丁香| 91久久久亚洲精品| 亚洲视频中文| 国产欧美视频一区二区| 亚洲欧美色一区| 欧美日韩综合一区| 欧美96在线丨欧| 久久婷婷成人综合色| 黄页网站一区| 免费亚洲一区二区| 亚洲免费av网站| 欧美在线一区二区| 欧美日韩福利视频| 一区二区三区四区五区视频| 日韩视频在线观看| 国产精品区一区| 欧美www在线| 在线综合亚洲| 极品尤物久久久av免费看| 欧美日韩aaaaa| 欧美在线视频导航| 亚洲国产精品一区二区久| 亚洲你懂的在线视频| 欧美日韩国产精品专区| 亚洲欧美变态国产另类| 欧美好吊妞视频| 欧美一级一区| 国产欧美日韩在线观看| 美女网站在线免费欧美精品| 亚洲香蕉在线观看| 亚洲第一综合天堂另类专| 激情成人亚洲| 国产精品久久9| 欧美xxxx在线观看| 欧美在线电影| 一区二区欧美在线| 亚洲欧洲一区二区三区| 久久精品中文字幕免费mv| 一区二区三区av| 亚洲国产专区校园欧美| 国产精品日韩在线一区| 欧美精品色网| 巨乳诱惑日韩免费av| 欧美一区二区三区在线| 亚洲伊人网站| 一本色道久久综合亚洲91| 欧美激情在线有限公司| 久久久久久久综合色一本| 亚洲欧美日韩精品久久| aa日韩免费精品视频一| 欧美日韩直播| 欧美激情第五页| 美女啪啪无遮挡免费久久网站| 午夜日韩视频| 亚洲在线中文字幕| 亚洲午夜视频| 亚洲尤物视频网| 亚洲欧美日韩综合aⅴ视频| 亚洲一区免费看| 亚洲影音一区|