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

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>
            欧美影院在线播放| 欧美日韩成人在线| 亚洲美女毛片| 亚洲国产精品久久久久婷婷老年| 久久久av网站| 欧美电影免费观看网站| 亚洲国产裸拍裸体视频在线观看乱了 | 亚洲男人的天堂在线aⅴ视频| 夜夜爽www精品| 欧美一区二区三区在线免费观看| 久久精品视频在线免费观看| 噜噜噜91成人网| 亚洲乱码国产乱码精品精天堂| 中文精品在线| 久久亚洲精品网站| 欧美视频日韩视频| 在线电影欧美日韩一区二区私密| 99re6这里只有精品视频在线观看| 亚洲男女自偷自拍| 欧美黑人在线观看| 亚洲一区二区精品| 美女脱光内衣内裤视频久久网站| 欧美日韩精品在线视频| 国产日韩欧美在线看| 亚洲日本中文| 久久久午夜精品| 夜夜嗨av一区二区三区四季av| 欧美一级淫片播放口| 欧美激情1区2区| 韩国精品久久久999| 亚洲一区观看| 亚洲欧洲在线看| 久久视频在线看| 国产精品中文在线| 宅男在线国产精品| 亚洲国产va精品久久久不卡综合| 亚洲伊人第一页| 欧美日韩国产不卡| 一区二区三区在线视频观看| 亚洲一区图片| 亚洲伦理网站| 亚洲高清av| 正在播放欧美一区| 蜜臀91精品一区二区三区| 欧美视频在线观看| 最新亚洲视频| 欧美wwwwww| 久久九九精品| 国产主播一区| 欧美一区二区在线播放| 99这里有精品| 欧美日本一区二区三区| 亚洲国产欧美久久| 久久躁日日躁aaaaxxxx| 性久久久久久| 国产精品专区第二| 欧美综合第一页| 亚洲一区二区在线免费观看| 欧美日韩 国产精品| 亚洲精品国产品国语在线app| 久久夜色精品国产欧美乱| 午夜精品视频网站| 国产日本欧美一区二区三区| 亚洲免费网站| 亚洲淫性视频| 国产婷婷色综合av蜜臀av| 久久国产精品99国产| 先锋影音久久久| 国产综合香蕉五月婷在线| 久久精品国产免费| 久久成人国产精品| 国模套图日韩精品一区二区| 久久精品主播| 久久精品国产综合精品| 在线观看日韩av先锋影音电影院| 久热爱精品视频线路一| 久久一二三国产| 亚洲区第一页| 9人人澡人人爽人人精品| 欧美天天视频| 久久久999精品免费| 久久国产精品久久w女人spa| 娇妻被交换粗又大又硬视频欧美| 免费亚洲网站| 欧美激情四色| 欧美一区二区三区在线| 久久九九热免费视频| 麻豆91精品| 亚洲大片av| 一本在线高清不卡dvd| 国产欧美日韩综合一区在线播放| 久久国产免费| 女生裸体视频一区二区三区| 在线亚洲观看| 久久爱另类一区二区小说| 亚洲国产mv| 一区二区三区国产在线| 国产一区二区三区四区在线观看 | 久久国产精品亚洲77777| 国产亚洲精品久久久久动| 美女国产一区| 国产精品第三页| 免费观看在线综合| 欧美日韩一区二区三区四区在线观看| 性欧美长视频| 欧美福利一区二区| 久久成人免费视频| 欧美精品一区二区三区四区| 久久高清免费观看| 欧美日韩a区| 老司机一区二区三区| 欧美日韩日日骚| 欧美国产激情| 国产一区二区电影在线观看| 亚洲精品欧美| 国产一区二区三区高清在线观看| 91久久久久久国产精品| 国产一区二区三区免费在线观看| 亚洲美女精品久久| 亚洲精品久久久久中文字幕欢迎你| 亚洲在线免费观看| 一区二区三区精密机械公司 | 欧美涩涩网站| 亚洲国产综合视频在线观看 | 亚洲视频一二区| 免费在线成人av| 久久一区二区三区av| 国产日本欧洲亚洲| 亚洲午夜视频在线| 亚洲永久在线观看| 欧美精品一区在线发布| 欧美激情第3页| 在线观看日韩av| 久久久精品tv| 卡通动漫国产精品| 激情成人在线视频| 久久久久综合| 免费观看成人鲁鲁鲁鲁鲁视频| 国产情人综合久久777777| av成人黄色| 亚洲欧美精品伊人久久| 国产精品久久久久国产精品日日 | 麻豆成人综合网| 在线观看成人av电影| 久久人人爽人人爽爽久久| 麻豆av一区二区三区| 亚洲第一区中文99精品| 久久免费视频网| 欧美大学生性色视频| 亚洲激情偷拍| 欧美日韩免费观看一区二区三区 | 欧美视频中文在线看 | 国产精品永久入口久久久| 亚洲一区在线播放| 久久不射中文字幕| 欧美成年人网站| 91久久精品国产| 亚洲精品乱码| 欧美日韩在线播放一区二区| 亚洲美女中出| 欧美一级理论片| 激情亚洲网站| 欧美激情片在线观看| 亚洲网站视频| 美女精品在线| 一个色综合导航| 国产美女一区| 欧美成人免费在线观看| 亚洲免费av网站| 久久国产精品99久久久久久老狼| 尤物在线观看一区| 欧美理论在线| 亚洲欧美国产高清| 欧美成人免费播放| 亚洲一区二区三区在线播放| 国际精品欧美精品| 欧美激情一区二区三级高清视频| 亚洲天堂av综合网| 欧美成人综合一区| 午夜电影亚洲| 91久久国产综合久久| 欧美视频免费在线| 久久视频这里只有精品| 一区二区日本视频| 免费观看不卡av| 欧美一区二区三区视频| 亚洲激情另类| 国产精品香蕉在线观看| 美女脱光内衣内裤视频久久网站| 国产精品99久久99久久久二8| 女同性一区二区三区人了人一| 亚洲欧美色一区| 亚洲美女福利视频网站| 国产亚洲美州欧州综合国| 欧美日本一区二区视频在线观看| 久久精品亚洲一区| 欧美亚洲免费| 亚洲一区精品电影| 日韩亚洲欧美在线观看| 亚洲电影免费观看高清|