C++开发的Redis数据导入工具优化

2020-01-06 13:06:45王振洲

之后通过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;