程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++開辟的Redis數據導入對象優化

C++開辟的Redis數據導入對象優化

編輯:關於C++

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分鐘)

以上所述就是本文的全體內容了,願望年夜家可以或許愛好。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved