[2013年10月14日]_[提高处理数据性能一点体会]

最近在做项目中处理大批量数据时,面对大量数据的时候,总感觉程序处理的性能过低。后在组长的帮助下,对代码进行一遍review,

找到了问题症结,性能提升了10倍,让我顿时喜出望外。因此,觉得有必要把困扰我多时的问题给总结出来。

我所处理的是.csv格式文本文件,文件大小平均在100MB以上,单个文件大约有接近几十万行的数据,总共大约有600多个这样的文件要处理。

我在写代码时,一般首先关注的是逻辑的正确性和严谨性(这是我个人的习惯),很少开始考虑程序的性能,但后来在测试时发现,在处理单个

文件时竟然花了40多分钟时间。

后来,花费了较长的时间找到了原因:

①在处理单行数据时,进行了链表指针移动操作来获取内存中某个数据的地址,这是非常消耗性能的,在运行期中,链表中的节点个数是不断累加的,因此就会发现在

处理时,假设行数为M,链表节点个数为f(M),随着处理行数的越多,f(M)线性增加,因此总共需要至少M*f(M)次指针移动,这还不包括其他代码运行时间,实际处理中

M大约为几十万,f(M)大约为几千个节点,因此光指针要移动几十亿次,所以程序才会这么慢。后来我将这块获取内存地址的操作,通过标计量赋值的方式来获取,顿时

性能大幅提升,这种修改后,赋值语句只需执行M次,所以在数据处理过程中,尽量慎用指针移动语句,尽量使用赋值语句来提升性能。

②在if,else分支中,将cpu经常命中的分支,放在前面,将不常命中的情况放在后面。这样就能保证经常出现的分支,所花费执行的时间更少,而不经常出现的分支,虽

然单次执行的时间较长,但是由于运行期出现的概率较少,因此,总体来看花费的时间更少。

 

posted @ 2013-10-15 10:22  齐祖  阅读(196)  评论(0编辑  收藏  举报