最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

總結(jié)一次C++ 程序優(yōu)化歷程

 更新時(shí)間:2020年09月10日 11:57:57   作者:tlanyan  
這篇文章主要記錄了一次C++程序優(yōu)化的歷程,給大家優(yōu)化C++程序一些啟發(fā),感興趣的朋友可以了解下

近期用到了一位師兄寫的C++程序,總體功能良好。使用不同的數(shù)據(jù)測試,發(fā)現(xiàn)了一個明顯的缺點(diǎn):大數(shù)據(jù)量下,預(yù)處理過程耗時(shí)很長。中科院的某計(jì)算集群,普通隊(duì)列中的程序運(yùn)行時(shí)間不能超過6個小時(shí)。而手上這套程序,大數(shù)據(jù)量下預(yù)處理就花了不止六個小時(shí),結(jié)果當(dāng)然是還沒開始就被結(jié)束了。

和天河二號的工作人員聯(lián)系,確認(rèn)沒有執(zhí)行時(shí)間限制。于是開通了天河二號的賬號,把程序扔上去跑。執(zhí)行大數(shù)據(jù)量時(shí),程序莫名被kill。詢問技術(shù)支持,得知是內(nèi)存耗盡,建議每個節(jié)點(diǎn)的進(jìn)程數(shù)少一點(diǎn)。如此折騰了兩次,大數(shù)據(jù)量的例子沒跑通,大部分時(shí)間都費(fèi)在預(yù)處理上,然后程序崩了,又要調(diào)整參數(shù)重新再來。

耗時(shí)長,最多是多花點(diǎn)機(jī)時(shí),問題不大。但是沒跑通的情況下每次要等五六個小時(shí),然后才知道能否運(yùn)行,測試然后反饋的過程太低效。忍無可忍,就開始進(jìn)行優(yōu)化吧!

第一步,找出耗時(shí)的點(diǎn)。原來的程序輸出日志用的cout,沒有附帶時(shí)間,不能通過日志發(fā)現(xiàn)耗時(shí)的點(diǎn)。為了找出性能關(guān)鍵點(diǎn),第一步是改進(jìn)log,在輸出中加上時(shí)間。寫了一個Log類,替換掉cout,程序的輸出中就帶上時(shí)間了:

#include "../include/Log.hpp"

#include 
#include 
#include 
#include 

using namespace std;

namespace tlanyan {

 string Log::datetimeFormat = "%F %T";

 Log::Log()
 {
 }

 void Log::info(const char* message) {
  cout << getCurrentTime() << " [info] " << message << endl;
 }

 void Log::debug(const char* message) {
#if DEBUG
  cout << getCurrentTime() << " [debug] " << message;
#endif;
 }

 const char* Log::getCurrentTime()
 {
  //locale::global(locale("zh_CN.utf8"));
  time_t t = time(NULL);
  char mbstr[512];
  if (strftime(mbstr, sizeof(mbstr), Log::datetimeFormat.c_str(), localtime(&t))) {
   return mbstr;
  }
  
  cerr << "獲取或格式化時(shí)間錯誤!" << endl;

  exit(1);
 }

 Log::~Log()
 {
 }
}

// 調(diào)用示例:
Log::info("program begins...");

通過查看Log,定位到了耗時(shí)長的過程。

  • 第一步,目測程序源代碼,找出問題所在。該段代碼比較好理解,主要是進(jìn)行數(shù)據(jù)初始化和打標(biāo)簽。程序中規(guī)中矩,都是操控內(nèi)存中的數(shù)組,沒有磁盤、網(wǎng)絡(luò)、進(jìn)程通信等耗時(shí)調(diào)用。審查代碼中發(fā)現(xiàn)第一個問題:內(nèi)存重分配。程序聲明了vector,沒有指定大小,后續(xù)代碼中使用push_back對數(shù)組的每一項(xiàng)進(jìn)行賦值。內(nèi)存分配和數(shù)據(jù)拷貝的代價(jià)是很大的,這應(yīng)該是一個性能點(diǎn)。修改代碼,聲明時(shí)指定數(shù)組大小。編譯并運(yùn)行程序,結(jié)果表明省下了30%的耗時(shí)。
  • 第二步,統(tǒng)計(jì)代碼的工作量。耗時(shí)過程的初始化數(shù)據(jù)量,大概是整個數(shù)據(jù)量的10%,就算其中內(nèi)嵌了兩層循環(huán),也不應(yīng)該耗時(shí)如此多。為了查看是否有額外工作量,加入了計(jì)數(shù)器。運(yùn)行結(jié)果顯示,該段函數(shù)的計(jì)算量不大,耗時(shí)長應(yīng)該有其他的原因。
  • 第三步,根據(jù)經(jīng)驗(yàn)判斷是緩存失效導(dǎo)致。第一反應(yīng)是用valgrind查看緩存命中,但valgrind模擬運(yùn)行的效率太差,幾個小時(shí)后kill掉放棄了。目測程序源碼,發(fā)現(xiàn)很多數(shù)據(jù)都是從全局內(nèi)存讀取,沒有充分利用緩存。修改代碼,使用局部變量緩存全局?jǐn)?shù)據(jù),接下來代碼中的數(shù)據(jù)使用緩存數(shù)據(jù)。經(jīng)過測試,效果非常明顯,提升了50%的效率。
  • 第四步,查找其他性能熱點(diǎn)。經(jīng)過幾次小的調(diào)優(yōu)測試,發(fā)現(xiàn)一些全局內(nèi)存訪問不可避免(隨機(jī)訪問,無法利用緩存),按照目前的方式難以繼續(xù)優(yōu)化。要大幅降低耗時(shí)需要重寫算法,目前無法保證對算法和程序意圖十分了解,遂暫時(shí)作罷。

優(yōu)化前后的結(jié)果對比:中等數(shù)據(jù)規(guī)模下,耗時(shí)從8'43"降到3'25";大數(shù)據(jù)量下,耗時(shí)從4h38'44"降到1h49'21"(注:使用自己的機(jī)器測試,CPU主頻3.46GHz,比中科院和天河二號集群的CPU主頻都要高,所以耗時(shí)短)。從數(shù)據(jù)看出,效果還是很明顯的。

以上就是C++ 程序優(yōu)化歷程總結(jié)的詳細(xì)內(nèi)容,更多關(guān)于C++ 程序優(yōu)化的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C++中引用的使用總結(jié)

    C++中引用的使用總結(jié)

    以下是對C++中引用的使用進(jìn)行了詳細(xì)的總結(jié)介紹,需要的朋友可以過來參考下,希望對大家有所幫助
    2013-10-10
  • C++中的四種類型轉(zhuǎn)換

    C++中的四種類型轉(zhuǎn)換

    類型轉(zhuǎn)換有c風(fēng)格的,當(dāng)然還有c++風(fēng)格的。c風(fēng)格的轉(zhuǎn)換的格式很簡單(TYPE)EXPRESSION,但是c風(fēng)格的類型轉(zhuǎn)換有不少的缺點(diǎn),有的時(shí)候用c風(fēng)格的轉(zhuǎn)換是不合適的,因?yàn)樗梢栽谌我忸愋椭g轉(zhuǎn)換,
    2015-08-08
  • C語言實(shí)現(xiàn)簡易連連看游戲

    C語言實(shí)現(xiàn)簡易連連看游戲

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)簡易連連看游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • 利用C++求解八數(shù)碼問題實(shí)例代碼

    利用C++求解八數(shù)碼問題實(shí)例代碼

    所謂八數(shù)碼問題是指這樣一種游戲,將分別標(biāo)有數(shù)字1,2,3,…,8的八塊正方形數(shù)碼牌任意地放在一塊3×3的數(shù)碼盤上,放牌時(shí)要求不能重疊,下面這篇文章主要給大家介紹了關(guān)于利用C++求解八數(shù)碼問題的相關(guān)資料,需要的朋友可以參考下
    2022-11-11
  • 用C語言實(shí)現(xiàn)排雷游戲

    用C語言實(shí)現(xiàn)排雷游戲

    大家好,本篇文章主要講的是用C語言實(shí)現(xiàn)排雷游戲,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-01-01
  • C語言實(shí)現(xiàn)密碼程序

    C語言實(shí)現(xiàn)密碼程序

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)密碼程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • CMake編譯中的庫文件和頭文件鏈接你了解嗎

    CMake編譯中的庫文件和頭文件鏈接你了解嗎

    這篇文章主要為大家詳細(xì)介紹了CMake編譯中的庫文件和頭文件鏈接,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • C++設(shè)計(jì)模式之享元模式

    C++設(shè)計(jì)模式之享元模式

    這篇文章主要介紹了C++設(shè)計(jì)模式之享元模式,本文講解了什么是享元模式、享元模式代碼實(shí)例、享元模式的優(yōu)點(diǎn)等內(nèi)容,需要的朋友可以參考下
    2014-10-10
  • 一文搞懂C++ 動態(tài)內(nèi)存

    一文搞懂C++ 動態(tài)內(nèi)存

    這篇文章主要介紹了C++ 動態(tài)內(nèi)存的的相關(guān)資料,文中示例代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • VSCode遠(yuǎn)程代碼開發(fā)及DNS隧道端口轉(zhuǎn)發(fā)實(shí)現(xiàn)遠(yuǎn)程辦公代碼

    VSCode遠(yuǎn)程代碼開發(fā)及DNS隧道端口轉(zhuǎn)發(fā)實(shí)現(xiàn)遠(yuǎn)程辦公代碼

    這篇文章主要介紹了VSCode遠(yuǎn)程代碼開發(fā)及DNS隧道端口轉(zhuǎn)發(fā)實(shí)現(xiàn)遠(yuǎn)程辦公,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-04-04

最新評論

成都市| 新邵县| 阿勒泰市| 偃师市| 莫力| 永康市| 盐源县| 女性| 七台河市| 垦利县| 武宣县| 习水县| 苗栗市| 鸡东县| 通州区| 鄂托克前旗| 奇台县| 屯门区| 无为县| 鄂伦春自治旗| 怀来县| 行唐县| 巴里| 新巴尔虎左旗| 五莲县| 杭州市| 阜城县| 禄丰县| 怀化市| 余姚市| 九寨沟县| 繁峙县| 永城市| 山阴县| 齐河县| 禄劝| 舟山市| 桑植县| 张北县| 新余市| 什邡市|