(同事的原创)关于效率优化的一点工作心得

文是单位同事胡计平的一个关于效率优化的总结,内容很实用,转贴到blog里,以备自己日后查看,也希望能对更多的人有所帮助

最近写一程序,跟效率优化打上了交道,把其中的体会写下来,供大家讨论分享,我想效率优化工作可以分为如下几个步骤:

(1)查找影响效率的瓶颈之处:定位的方法当然是使用时间函数,一般精确的使用GetTickCount就可以,非常精确的使用

function GetCycleCount: Int64;
asm
  RDTSC;    //得到当前CPU的时钟周期数。
end;

想必这个知识大家都应该已经知道了。定位的过程大概是先定位函数,再到一条语句,大多数情况下,效率的问题就是一条语句引起的。不过有几点值得大家注意,比如在一个函数内使用时间函数测试出来的总时间为1s,然而在该函数调用处使用时间函数测试出来的总时间却为5s,这个时候如果你稍微疏忽,你很可能定位不到到底是哪里的问题。这里就涉及到了一些隐藏的地方,它们消耗了时间,你却不知道,详述将在下文。

(2)找到了瓶颈之处,接下来就是分析原因,这个过程可能会遇到很容易的,一看就知道了原因所在,但是更多情况下它会隐藏着,不易发现,需要我们的耐心,细心和信心。分析和查找问题的原因,我自己总结了下面这些方法或者说可以考虑的方面:

1.是否可以换个核心思想:对于类似解析器,编译器的程序,很有可能在现有的核心思想下现有的实现方式已经是最优了,几乎没有提高的余地,那么我们可以想想换个思想。比如XML解析器,微软提供了Dom,但是它的核心思想已经决定了它就只能那么快了,并且消耗内存巨大,大概是源文件的5-10倍,SAX的事件驱动模型也决定了它比Dom更快更少耗内存,但是新一代的XML解析器VTD-XML(完全基于字节流解析,没有对象)也注定了它比所有其他的XML解析器具有更多的优势!

2.算法代码编写是否正确:前阵子,姚柯跟我说,公共资源的排序类中有一个条件写反了,使得该使用二分查找的地方使用了普通查找,修改后发现构造交叉表的效率提高10倍以上,整体查询效率提高7-8倍,从这个事件中我们可以看到考虑算法代码正确与否是很有必要的,有时候问题就隐藏在其中,而且隐藏得很深!

3.算法选择是否恰当:很明显,如果你使用了冒泡排序,怎么也快不了。当然大部分情况不会是这样的,更多情况是要考虑当前情况和环境来选择的,很有可能平时我们认为效率基本一样的多种算法,但是在当前情况下可能就只有一种最恰当,但不幸地是之前我们选择错了,那么现在你就有了改进的机会!

4.是否不必要的循环次数过多:有时候多出很多不必要的循环,但是不易发现,我们在优化的时候,这是个重点考虑的对象,除非你已经极其肯定就是要运行这么多次,否则要一次又一次的怀疑自己的观点。

5.关键函数中是否有很多的string参数:我说的关键函数是指调用次数很多。关键函数中最好不要申明string,动态数组之类的临时变量,因为它们在该函数最开始有隐藏的初始化,在函数结尾有隐藏的释放。我曾经在一个关键函数中申明了一个动态数组,测试效率的时候,在定位的时候就出现了(1)中提到的现象,原来是临时变量导致的,最后改造函数,去掉临时变量,函数效率马上提高一倍!

6.是否因为派生机制导致效率问题:我在写一个程序的时候,其中涉及到了派生关系,由于派生体系中的一个方法A被使用者调用的次数非常多,达百万次以上。开始的时候也是优化函数内部,但是后来发现函数内部不可能再优化了,但是整体效率还是差一些,于是苦思冥想,发现我用了派生机制,每次调用该方法的时候,都要去VMT表查找,消耗了一些时间,不要小看这个,当调用次数巨大的时候,你会发现这个原因影响很大。当我去掉了派生关系,直接用静态方法的时候,整体效率提高一倍多,不得不说让人欣喜!

7.是否接口使用不恰当:接口使用不恰当可能的原因有:你对此不熟悉;接口本身提供的就有迷惑性。比如你对公司的平台不熟悉,那么很可能出现使用不当,导致效率出现问题,这就是典型的不熟悉的原因;我最近做一个跟word有关系的程序,其中一个要求就是得到word的文档结构图。在遍历word编程接口中的Paragraphs接口时,开始看了接口原型,发现有Count,Item(AIndex)等属性和方法,于是就用了for循环遍历,但是测试效率时发现当Count有2000多个的时候,居然需要180s才能遍历完成!我怎么也不相信这么慢,于是开始定位,发现居然是iParagraph := iParagraphs.Item(I)这行代码巨慢,它用了160s。但是我不太相信微软提供的遍历接口会有这么慢,于是去接口原型中寻找其他途径,果然我有了新发现,在Paragraph接口中有Next,Previous方法,所以可以进行迭代式遍历,换成迭代式访问后,马上只需要20s了,所以估计它内部是链式存储。事后想,象微软提供的这样的接口,真的很有迷惑性,两种遍历方式,但是相差甚远!值得我们思考和注意!

(3)找到了原因之后,我想较多情况下还是可以找到解决问题的办法,当然也有很多不好解决的,就象上面(2)提到的第一点原因。还是那句话,更多的是需要我们更耐心,细心和信心,当然开阔的思维和思考是最基础,最重要的!

时间: 2024-10-13 11:22:38

(同事的原创)关于效率优化的一点工作心得的相关文章

关于JSON数据体积优化的一点小心得

最近在做的一个项目里传输的json数据比较大,造成了线程间的卡顿,于是想优化一下json数据的体积. 可以看到在json文件里有很多无用的字段,这些字段占据了大量的存储空间. 对数据的结构作一下优化,如下 将对象的key值单独存在一个数组里,value值存在另一个数组. 调整数据结构后体积的变化也非常明显,减少了40%的体积. 原文地址:https://www.cnblogs.com/BlackFungus/p/12315136.html

(转)as3效率优化

1.改进算法无论对于那一种程序,好的算法总是非常重要的,而且能够极大地提高程序性能,所以任何性能的优化第一步就是从算法或者说程序逻辑的优化开始,检查自己的程序是否有多余的运算,是否在没有必要的时候做了无用功,往往从这些方面就能找到那些导致性能低下的地方. 2.优化细节代码针对细节总是好的,有一些小技巧比如:用 var obj:Object = {}; 要比 var obj:Object = new Object();要好:var arr:Array = []; 要比 var arr:Array

游戏效率优化(2) 使用const关键字

游戏效率优化(2)使用const关键字 DionysosLai  2014-5-15 使用const有很多好处,比方保护被修饰的东西,防止意外修改,提高程序健壮性等作用.不过使用const 可以提高程序运行效率,却很少有人知道. 下面看几个例子,在看cocos2d源码时,我们经常会看到如下类似的代码: ccpAdd(const CCPoint& v1, const CCPoint& v2) { return v1 + v2; } ccpSub(const CCPoint& v1,

c++程序的效率优化初涉

能写出稳定高效的程序一直是程序员所追求的,今天就和大家一起探讨一下关于C++程序优化的几点看法. 由于C/C++语言的复杂性,致使C++编译器隐藏了层层幔布,我们不经意的一条语句都可能是编译器幕后几经周折的结果,在要求程序高效运行的环境下,每一条语句都会让我们慎之又慎,而程序优化又是个十分广泛的话题,包括程序架构设计的优化,语言本身的优化,编程技巧和策略等等,如此大的范围非我能力所及,这里谈的优化就是在实际开发中遇到的问题. 一.  举手之劳的小差别 既然说优化就一定要仔细,不放过任何微小的细节

对Listview控件的效率优化

不管在Android平台还是IOS平台,Listview或者是类似控件,在数据显示方面都占据着相当重要的位置.而作为最重要的数据展示形式,Listview控件或者是类似的需要使用Adapter的控件的加载以及数据展示的效率和优化,就被摆在了一个很重要的位置,本篇文章主要给大家介绍,如何可以实现Listview控件的效率优化. 1.重用已经生成过的Item View 我们都知道,Listview的数据显示,少不了Adapter的设计,所以优化在重点都在如何设计Adapter中.而BaseAdapt

漫游Kafka设计篇之效率优化

原文地址:http://blog.csdn.net/honglei915/article/details/37564757 Kafka在提高效率方面做了很大努力.Kafka的一个主要使用场景是处理网站活动日志,吞吐量是非常大的,每个页面都会产生好多次写操作.读方面,假设每个消息只被消费一次,读的量的也是很大的,Kafka也尽量使读的操作更轻量化. 我们之前讨论了磁盘的性能问题,线性读写的情况下影响磁盘性能问题大约有两个方面:太多的琐碎的I/O操作和太多的字节拷贝.I/O问题发生在客户端和服务端之

php程序效率优化的一些策略小结

php程序效率优化的一些策略小结 1.在可以用file_get_contents替代file.fopen.feof.fgets等系列方法的情况下,尽量用 file_get_contents,因为他的效率高得多!但是要注意file_get_contents在打开一个URL文件时候的PHP版本问题; 2.尽量的少进行文件操作,虽然PHP的文件操作效率也不低的; 3.优化Select SQL语句,在可能的情况下尽量少的进行Insert.Update操作(在update上,我被恶批过); 4.尽可能的使

[原创]Java性能优化权威指南读书思维导图

[原创]Java性能优化权威指南读书思维导图 书名:Java性能优化权威指南 原书名:Java performance 作者: (美)Charlie Hunt    Binu John 译者: 柳飞 陆明刚 京东购书地址: http://item.jd.com/11407830.html 介绍:<Java性能优化权威指南>是Java应用性能调优的圣经,内容通俗易懂,介绍了大量的监控和测量工具,涉及各种硬件架构和操作系统.涵盖了如何构建实验.解释结果以及如何采取行动等技巧. 现在自己是越来越忙,

jquery选择器效率优化问题

jquery选择器效率优化问题   jquery选择器固然强大,但是使用不当回导致效率问题: 1.要养成将jQuery对象缓存进变量的习惯 //不好的写法 $('#btn').bind("click",function() {}); $('#btn').css("border","1px solid red"); $("#btn").css("background-color","green&qu