问题描述
做的一个功能:
从access的mdb数据库文件里提取数据,然后生成模型进行布置。c++实现。
但不知道为什么,每布置一次,都要至少4秒的时间。
心想mdb的性能不会这么差吧,去网上差,好像也鲜有人提到mdb性能很差。
那看来就是自己的问题了。
但浏览代码,把可能的影响效率的地方都做了优化,操作效率上确实有所提升,但并没有质的飞跃。百思不得其解,几欲放弃。
反复进行分析,最后通过下面的方法定位到了setlocale函数,项目里的一个底层函数用到了它,这个函数主要用来将string和wstring互转。
具体排查过程
需要优化的操作的逻辑,通过提前return,发现减少的时间很“均匀“:执行的代码多,时间耗时就多,执行的少,耗时就少。看起来很”合理“。
通过对每一部分逻辑加入循环,从而放大耗时的逻辑。像下面这样
比如整个逻辑由4个fun函数来完成:
void fun()
{
fun1();
fun2();
fun3();
fun4();
}
对每一个段进行排查,对可能的耗时逻辑段进行放大:
void fun()
{
for(int i=0; i<1000; +i)
{
fun1();
}
fun2();
fun3();
fun4();
}
结果终于发现在执行string和wstring互转函数的时候,耗时异常的大。里面有个setlocal函数,就是罪魁祸首。最后不用这种方式,问题解决。