[2013年10月14日]_[提高处理数据性能一点体会]
最近在做项目中处理大批量数据时,面对大量数据的时候,总感觉程序处理的性能过低。后在组长的帮助下,对代码进行一遍review,
找到了问题症结,性能提升了10倍,让我顿时喜出望外。因此,觉得有必要把困扰我多时的问题给总结出来。
我所处理的是.csv格式文本文件,文件大小平均在100MB以上,单个文件大约有接近几十万行的数据,总共大约有600多个这样的文件要处理。
我在写代码时,一般首先关注的是逻辑的正确性和严谨性(这是我个人的习惯),很少开始考虑程序的性能,但后来在测试时发现,在处理单个
文件时竟然花了40多分钟时间。
后来,花费了较长的时间找到了原因:
①在处理单行数据时,进行了链表指针移动操作来获取内存中某个数据的地址,这是非常消耗性能的,在运行期中,链表中的节点个数是不断累加的,因此就会发现在
处理时,假设行数为M,链表节点个数为f(M),随着处理行数的越多,f(M)线性增加,因此总共需要至少M*f(M)次指针移动,这还不包括其他代码运行时间,实际处理中
M大约为几十万,f(M)大约为几千个节点,因此光指针要移动几十亿次,所以程序才会这么慢。后来我将这块获取内存地址的操作,通过标计量赋值的方式来获取,顿时
性能大幅提升,这种修改后,赋值语句只需执行M次,所以在数据处理过程中,尽量慎用指针移动语句,尽量使用赋值语句来提升性能。
②在if,else分支中,将cpu经常命中的分支,放在前面,将不常命中的情况放在后面。这样就能保证经常出现的分支,所花费执行的时间更少,而不经常出现的分支,虽
然单次执行的时间较长,但是由于运行期出现的概率较少,因此,总体来看花费的时间更少。