亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

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

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

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

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

#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 << "獲取或格式化時間錯誤!" << endl;

  exit(1);
 }

 Log::~Log()
 {
 }
}

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

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

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

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

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

相關文章

  • C語言實現(xiàn)簡單的通訊錄管理系統(tǒng)

    C語言實現(xiàn)簡單的通訊錄管理系統(tǒng)

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)通訊錄管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • C++實現(xiàn)簡單酒店管理系統(tǒng)

    C++實現(xiàn)簡單酒店管理系統(tǒng)

    這篇文章主要為大家詳細介紹了C++實現(xiàn)簡單酒店管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • C++中函數(shù)的默認參數(shù)詳細解析

    C++中函數(shù)的默認參數(shù)詳細解析

    在函數(shù)聲明或定義時,直接對參數(shù)賦值,該參數(shù)就是默認參數(shù)。在函數(shù)調(diào)用時,省略部分或全部參數(shù),這時就會使用默認參數(shù)進行代替
    2013-10-10
  • c語言實現(xiàn)整蠱朋友小程序(附源碼)

    c語言實現(xiàn)整蠱朋友小程序(附源碼)

    這篇文章主要給大家介紹了關于c語言實現(xiàn)整蠱朋友小程序的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-02-02
  • C語言system 自動關機函數(shù)代碼

    C語言system 自動關機函數(shù)代碼

    這篇文章主要介紹了C語言system 自動關機函數(shù)代碼,需要的朋友可以參考下
    2016-04-04
  • C語言不使用strcpy函數(shù)如何實現(xiàn)字符串復制功能

    C語言不使用strcpy函數(shù)如何實現(xiàn)字符串復制功能

    這篇文章主要給大家介紹了關于C語言不使用strcpy函數(shù)如何實現(xiàn)字符串復制功能的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-02-02
  • c++棧內(nèi)存和堆內(nèi)存的基本使用小結

    c++棧內(nèi)存和堆內(nèi)存的基本使用小結

    本文主要介紹了c++棧內(nèi)存和堆內(nèi)存的基本使用小結,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-07-07
  • 純C語言實現(xiàn)五子棋

    純C語言實現(xiàn)五子棋

    本文給大家分享的是去年制作的一個純C語言實現(xiàn)的五子棋的代碼,雖然沒有帶漂亮的界面,還是推薦給大家,有需要的小伙伴可以參考下。
    2015-03-03
  • C++實現(xiàn)WebSocket服務器的案例分享

    C++實現(xiàn)WebSocket服務器的案例分享

    WebSocket是一種在單個TCP連接上進行全雙工通信的通信協(xié)議,與HTTP協(xié)議不同,它允許服務器主動向客戶端發(fā)送數(shù)據(jù),而不需要客戶端明確地請求,本文主要給大家介紹了C++實現(xiàn)WebSocket服務器的案例,需要的朋友可以參考下
    2024-05-05
  • 教你如何使用C++ 統(tǒng)計地鐵中站名出現(xiàn)的字的個數(shù)

    教你如何使用C++ 統(tǒng)計地鐵中站名出現(xiàn)的字的個數(shù)

    通過本文教大家如何使用C++ 統(tǒng)計地鐵中站名出現(xiàn)的字的個數(shù),本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2022-01-01

最新評論