为了提升系统性能,对用了很久的算法库(静态库)里面的统计函数进行改造;将原来每个统计周期都释放上一个统计周期数据结构,全部重新申请的做法,改成一次申请,后面每次都复用现有数据结构。
之前已经测试过这块代码,当时感觉性能提升不是很明显就没有用,这两天同样是为了提升性能,将原来对不同统计项目的串行统计方法,改造成了每个统计项目都开一个线程,并发统计。
然后发现线程里面就是释放数据结构重新分配那块挺费时,于是把复用数据结构的代码又用上了,可是运行过程中居然出现段错误,调试发现新函数返回的结构体指针地址不能访问,进一步跟进调试发现函数里面返回的地址居然跟外面接收到的地址不一致。。。
看返回前后两个值其实是很接近的,返回后的值高位全被置1了,怀疑数据类型不一致引起的,但是接受返回值的变量和返回值都是指针类型,之前遇到过windows上dll里面malloc的地址,dll外面不能用的情况,但是linux上好像没查到相关信息,而且老函数也是这么传指针的。。。
各种尝试、求助都无果
然后翻编译信息突然瞟到编译结果里面的一条waring信息
assignment makes pointer from integer without a case [enabled by default]
![](https://i-blog.csdnimg.cn/blog_migrate/482c9b28064873b1d3f8cae9e256ac61.jpeg)
- 这下清楚了,原来在库里面新增的函数,但是没在头文件里面新增,编译器不知道函数返回值类型,就默认成int了,指针强转成int发生了变化。。。
- 最后多线程和数据结构复用还是有性能提升的,另外gcc -g和gcc -O性能还是有差的
- 另外是时候把waring全部解决掉了,每次看着waring刷屏都自动忽略了。。。出了问题找都找不到
- 另外为毛有钱,数据量又大的地方要用性能差的机器了。。。cpu架构是e5_2650_v3(cat /proc/cpuinfo),内存Configured Clock Speed 1866MHz(dmidecode -t memory),其他点机器普遍是cpu e5_2650_v4,mem 2133MHz
- 最后,其实上面优化完这个破机器还是跑不动。。。最后算了一下,不需要统计那么多数据,将统计1000万改成100万就好了,速度大幅度提升。。。