C++開辟的Redis數據導入對象優化。本站提示廣大學習愛好者:(C++開辟的Redis數據導入對象優化)文章只能為提供參考,不一定能成為您想要的結果。以下是C++開辟的Redis數據導入對象優化正文
配景
應用C++開辟了一個Redis數據導入對象
從oracle中將一切表數據導入到redis中;
不是純真的數據導入,每條oracle中的原有記載,須要經由營業邏輯處置,
並添加索引(redis聚集);
對象完成後,機能是個瓶頸;
優化後果
應用了2個樣本數據測試:
樣本數據a表8763 筆記錄;
b表940279 筆記錄;
優化前,a表耗時11.417s;
優化後,a表耗時1.883s;
用到的對象
gprof, pstrace,time
應用time對象檢查每次履行的耗時,分離包括用戶時光和體系時光;
應用pstrace打印及時運轉,查詢過程重要的體系挪用,發明耗時點;
應用gprof統計法式的耗時匯總,集中精神優化最耗時的處所;
應用簡介:
1.對g++的一切編纂和銜接選項都必需要加上-pg(第一天因為沒有在銜接處加上-pg選項,招致沒法出統計申報);
2.履行完法式後,本目次會發生gmon.out文件;
3.gprof redistool gmou.out > report,生成可讀文件report,翻開report集中優化最耗時的函數;
優化進程
優化前11.417s:
time ./redistool im a a.csv
real 0m11.417s
user 0m6.035s
sys 0m4.782s (發明體系挪用時光太長)
文件內存映照
體系挪用時光太長,重要是文件讀寫,初步斟酌是讀取文件時,挪用api次數過於頻仍;
讀取樣本采取的是文件fgets一行行的讀取,采取文件內存映照mmap後,可直接應用指針操作全部文件內存快;
日記開關提早
改良了文件讀寫後,發明優化後果比擬無限(進步了2s閣下);fgets是C的文件讀取庫函數,比擬體系read(),是帶了緩沖區了,應當不會太慢(網上有人測試,文件內存映照比擬fgets()能快上一個數目級,感到場景應當比擬特別);
以後經由過程pstrace對象發明log.dat翻開次數過量;本來是調試日記的開關寫到了前面,招致 調試日記都是會翻開日記文件open("log.dat");
將日記開關提早;改良後,3.53s
time ./redistool im a a.csv
real 0m3.530s
user 0m2.890s
sys 0m0.212s
vector空間事後分派
後續經由過程gprof剖析,某個函數的vector內存分派次數多,並有很多復制次數:
改良以下這行代碼:
vector <string> vSegment;
應用靜態vector變量,並事後分派內存:
static vector <string> vSegment;
vSegment.clear();
static int nCount = 0;
if( 0 == nCount)
{
vSegment.reserve(64);
}
++nCount;
優化後,晉升至2.286s
real 0m2.286s
user 0m1.601s
sys 0m0.222s
異樣,別的一個類中的成員vector也應用事後分派空間(在結構函數中):
m_vtPipecmd.reserve(256);
優化後,晉升至2.166s;
real 0m2.166s
user 0m1.396s
sys 0m0.204s
函數改寫 && 內聯
持續履行法式,發明SqToolStrSplitByCh()函數消費過年夜,改寫全部函數邏輯,並將改寫後的函數內聯:
優化後,晉升至1.937s
real 0m1.937s
user 0m1.301s
sys 0m0.186s
去除調試符和優化監測符號
最初,去失落debug和pg調試符號後,終究後果為1.883s;
real 0m1.883s
user 0m1.239s
sys 0m0.191s
知足臨盆請求
以上最初幾步看似毫秒級的晉升,擴展到全表數據後,後果就很顯著了;
優化後,臨盆上a表為152w,導入耗時年夜約326s(~6分鐘);
b表數據420w,導入耗時年夜約1103s(~18分鐘)
以上所述就是本文的全體內容了,願望年夜家可以或許愛好。