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

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++ 應(yīng)用程序性能優(yōu)化

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

C++ 應(yīng)用程序性能優(yōu)化

eryar@163.com

1. Introduction

對于幾何造型內(nèi)核OpenCASCADE,由于會涉及到大量的數(shù)值算法,如矩陣相關(guān)計算,微積分,Newton迭代法解方程,以及非線性優(yōu)化的一些算法,如BFGS,F(xiàn)RPR,PSO等等用于多元函數(shù)的極值求解,所以這些數(shù)值算法的性能直接影響系統(tǒng)的性能。軟件的性能優(yōu)化是計算機軟件開發(fā)過程中需要一直關(guān)注的重要因素,因此有必要學(xué)習(xí)下C++應(yīng)用程序性能優(yōu)化的方法。

在網(wǎng)上尋找相關(guān)資料時,發(fā)現(xiàn)這方面的資料也很少,最后發(fā)現(xiàn)一本由電子工業(yè)出版社出版的《C++應(yīng)用程序性能優(yōu)化方法》,從中可以學(xué)習(xí)下IBM的性能優(yōu)化方法。

本文主要結(jié)合《C++性能優(yōu)化方法》并結(jié)合代碼實例來說明內(nèi)存優(yōu)化處理對程序性能的影響。看完本書,其實發(fā)現(xiàn)C++性能優(yōu)化方法主要還是依賴的計算機相關(guān)的基礎(chǔ)知識,比如說計算機操作系統(tǒng),數(shù)據(jù)結(jié)構(gòu)與算法等等。

2.Memory Optimize

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

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

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

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

默認(rèn)的內(nèi)存管理函數(shù)還考慮到多線程的應(yīng)用,需要在每次分配和釋放內(nèi)存時加鎖,同樣增加開銷。可見,如果應(yīng)用程序頻繁地在堆上分配格釋放內(nèi)存,則會導(dǎo)致性能的損失。并且會使系統(tǒng)中出現(xiàn)大量的內(nèi)存碎片,降低內(nèi)存的利用率。

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

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

3.Code Example

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


/*
*    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;
}

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

wpsECE0.tmp

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

wpsECF1.tmp

時間的開銷也是集中在內(nèi)存的分配上面:

wpsED02.tmp

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

wpsED03.tmp

程序運行的結(jié)果如下圖所示:

wpsED13.tmp

與沒有使用內(nèi)存優(yōu)化的時候0.1相比,使用了內(nèi)存優(yōu)化處理的要快40%左右。

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

wpsED14.tmp

注意現(xiàn)在內(nèi)存分配使用的是Standard_MMgrOpt類中的Allocate函數(shù):

wpsED15.tmp

總的來說,將環(huán)境變量MMGT_OPT設(shè)置成1來使用OCCT的內(nèi)存優(yōu)化算法,性能提升還是很明顯的。

4.Conclusion

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

找到性能瓶頸,就要對其進行分析原因,進而修改程序,提高性能。這方面的方法論可以借鑒《C++應(yīng)用程序性能優(yōu)化》,從數(shù)據(jù)結(jié)構(gòu)、程序啟動、內(nèi)存管理等方面來分析。摘出此書中程序性能優(yōu)化的流程圖:

wpsED16.tmp

5. References

1.馮宏華,徐瑩,程遠,汪磊. C++應(yīng)用程序性能優(yōu)化. 電子工業(yè)出版社.

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

3.OpenCASCADE Foundation Classes Document 7.0.0. 2016

Feedback

# re: C++ 應(yīng)用程序性能優(yōu)化  回復(fù)  更多評論   

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

# re: C++ 應(yīng)用程序性能優(yōu)化  回復(fù)  更多評論   

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

# re: C++ 應(yīng)用程序性能優(yōu)化  回復(fù)  更多評論   

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

# re: C++ 應(yīng)用程序性能優(yōu)化  回復(fù)  更多評論   

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

您好!

感謝關(guān)注,郵件已經(jīng)回復(fù),請查收。

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>
            亚洲人成网站777色婷婷| 欧美在线地址| 亚洲精品乱码久久久久久蜜桃麻豆 | 亚洲香蕉网站| 夜夜嗨av一区二区三区中文字幕 | 午夜精品久久久久久久久久久| 亚洲精品久久久久久久久久久| 亚洲成色999久久网站| 久久一区中文字幕| 欧美成人一区二免费视频软件| 久久精品国产欧美亚洲人人爽| 久久高清国产| 国产精品成人av性教育| 国产在线一区二区三区四区| 久久夜色精品国产欧美乱| 亚洲综合成人婷婷小说| 亚洲一区二区四区| 美女爽到呻吟久久久久| 欧美日韩另类国产亚洲欧美一级| 欧美日韩中文在线| 在线成人激情黄色| 亚洲一区成人| 亚洲福利视频专区| 欧美一区激情| 欧美午夜大胆人体| 亚洲国产婷婷香蕉久久久久久99| 亚洲一区三区电影在线观看| 亚洲高清在线观看一区| 亚洲欧美视频在线| 国产精品乱码| 亚洲欧美日韩视频二区| 91久久久久久久久| 久久三级视频| 一区免费在线| 久久久天天操| 久久精品91| 欧美成人一品| 亚洲综合欧美| 国产精品一区二区三区久久| 一区二区三区不卡视频在线观看 | 99精品国产在热久久婷婷| 久久九九国产精品| 国产亚洲精品bt天堂精选| 欧美一级理论片| 欧美亚洲一区二区在线| 国产一本一道久久香蕉| 久久久久国产精品厨房| 亚洲一区二区在| 国产精品午夜国产小视频| 欧美专区日韩视频| 午夜精品久久久久久99热软件| 国产午夜精品视频| 亚洲第一精品夜夜躁人人爽| 欧美裸体一区二区三区| 亚洲欧美中日韩| 久久婷婷国产综合精品青草| 99视频+国产日韩欧美| 亚洲与欧洲av电影| 夜夜嗨av色一区二区不卡| 亚洲一区二区av电影| 在线看不卡av| 亚洲欧美日韩久久精品| 亚洲青涩在线| 牛人盗摄一区二区三区视频| 欧美一级黄色录像| 欧美亚州一区二区三区| 亚洲精品资源| 亚洲欧洲一区二区天堂久久| 午夜视频一区| 亚洲欧美一区二区三区在线| 欧美刺激性大交免费视频| 开元免费观看欧美电视剧网站| 欧美午夜视频| 午夜精品一区二区三区在线| 亚洲婷婷在线| 国产精品视频1区| 亚洲视频专区在线| 午夜久久福利| 国产精品一区久久久久| 亚洲影院色无极综合| 久久久人成影片一区二区三区观看 | 日韩亚洲一区二区| 欧美激情区在线播放| 一本色道久久综合狠狠躁篇的优点 | 国产精品久久久久久久久果冻传媒 | 欧美在线观看一区| 国产一区自拍视频| 免费一级欧美片在线播放| 免费影视亚洲| 亚洲天堂成人在线视频| 欧美日韩亚洲不卡| 羞羞色国产精品| 日韩亚洲欧美在线观看| 欧美吻胸吃奶大尺度电影| 国产日韩精品电影| 欧美激情精品久久久久久变态| av成人免费| 欧美日韩在线一区二区| 久久精品卡一| 在线视频一区二区| 欧美多人爱爱视频网站| 亚洲欧美日韩国产成人精品影院| 亚洲成人在线网| 黄色工厂这里只有精品| 亚洲一区在线直播| 国产亚洲欧美中文| 国产精品久久久久久久久动漫| 久久综合网hezyo| 久久久久高清| 久久久噜噜噜久久中文字免| 午夜日韩电影| 久久精品2019中文字幕| 午夜精品福利在线观看| 亚洲一区www| 午夜精品久久久久久久 | 亚洲一卡二卡三卡四卡五卡| 亚洲人成人一区二区三区| 在线观看亚洲一区| 激情小说亚洲一区| 亚洲国产精品成人| 亚洲美女中出| 亚洲欧美999| 久久深夜福利免费观看| 欧美国产一区二区在线观看| 欧美激情一区二区三区蜜桃视频| 亚洲精品国产精品国自产观看浪潮| 欧美激情亚洲一区| 一区二区三区四区五区精品| 久久精品视频va| 欧美日韩中文字幕在线| 国内外成人免费激情在线视频 | 另类成人小视频在线| 欧美日韩国产色视频| 伊伊综合在线| 久久精品国产亚洲一区二区三区 | 久久精品91| 免费日韩成人| 洋洋av久久久久久久一区| 久久成人18免费网站| 欧美日韩大陆在线| 激情六月婷婷久久| 欧美激情亚洲另类| 亚洲精品国精品久久99热| 最新国产成人在线观看| 日韩亚洲精品在线| 免费成人网www| 99re亚洲国产精品| 午夜亚洲视频| 国产精品一区亚洲| 亚洲国产小视频| 久久成年人视频| 宅男噜噜噜66一区二区| 鲁鲁狠狠狠7777一区二区| 一区二区三区色| 国产精品国产三级国产aⅴ9色 | 在线视频精品一区| 欧美影院精品一区| 国产精品国产三级国产普通话蜜臀 | 国产精品成人在线| 亚洲精品美女在线| 国产资源精品在线观看| 久久人体大胆视频| 欧美影院午夜播放| 欧美极品影院| 久久精品官网| 欧美综合国产| 国产亚洲精品久久久| 欧美一级二区| 亚洲福利在线观看| 亚洲国产裸拍裸体视频在线观看乱了中文| 久久精品视频在线观看| 伊人久久综合| 亚洲狠狠婷婷| 亚洲第一主播视频| 亚洲美女区一区| 欧美精品一区二区高清在线观看| 国产精品卡一卡二卡三| …久久精品99久久香蕉国产| 国产婷婷色一区二区三区| 亚洲视屏在线播放| 亚洲伦理在线观看| 欧美午夜三级| 这里只有精品丝袜| 久久国产精品色婷婷| 1024欧美极品| 欧美国产亚洲视频| 欧美一区精品| 欧美高清视频| 欧美亚洲尤物久久| 亚洲人成高清| 欧美日韩一区二区免费在线观看| 午夜精品久久久久久久99水蜜桃| 欧美在线日韩精品| 日韩视频二区| 美女91精品| 亚洲欧美日韩视频一区| 最近中文字幕日韩精品| 日韩一级大片在线| 伊人天天综合| 欧美系列精品|