浅谈代码的执行效率(1):算法是关键

前一段时间在博客园里看到这样一篇文章,那位兄弟谈到程序效率的关键是“简短”。他说,“程序越简短,其可执行代码就越少,就越有效率”,而在编写程序的时候,“要尽量改进我们的算法,而改进算法中最重要的一条,就是减少语句”。这句话从表面上似乎正确,但我认为性能这问题不能用“简短”这种方式去思考,否则会进入一些误区。我整理了一下思路,希望可以从几个方面把详细谈一下这个问题。

首先,如果说“简短的代码效率高”,那么什么叫作“简短”呢?姑且理解为“代码少”吧。如果“代码少”能够得出“效率高”,那我认为还需要其他一些条件,例如:

代码完全是顺序执行的

每行代码的效率相同

但是,这对于使用高级语言的程序员来说,这两条基本上都无法成立,因为:

代码中有条件跳转(如循环),因此一段简短的代码最终执行的“次数”可能比一段复杂的代码要多。这是很常见的情况,并非如那位兄弟所说“两三行代码写出死循环”这样的“特例”。

每行代码的效率几乎不可能相同。试想一个i++和一个方法调用,他们的性能开销怎么可能相同呢?再者,这个特性并非是“高级语言”特有的,连CPU指令也是一样(以后我们再来详谈这个问题)。

其实这就是目前编程工作中不可能回避的现状,那就是高级语言并不直接反映出机器的执行过程。同时,我们不能从代码表面的简短程度来判断程序效率的高低。正如那位朋友所谈,影响程序的关键因素之一是算法的选择,但我不同意他说算法优化的关键在于“减少语句”。从一定程度上讲,选择高效的算法的确是为了减少指令执行的“总量”,但它并不是如那篇文章所说通过“少一些变量”,“少一些判断”来进行的,而是在于大幅的逻辑改变来减少总体的操作。

事实上,我们很容易便能举出代码简短,但是性能较差的算法。就拿最常见的排序算法来说,冒泡排序不可谓不简单:

public void BubbleSort(int[] array)
{
   for (int i = array.Length - 1; i >= 0; i--)
   {
     for (int j = 1; j <= i; j++)
     {
       if (array[j - 1] > array[j])
       {
         int temp = array[j - 1];
         array[j - 1] = array[j];
         array[j] = temp;
       }
     }
   }
}

时间: 2024-10-26 10:47:09

浅谈代码的执行效率(1):算法是关键的相关文章

浅谈代码的执行效率(3):缓存与局部性

在前两篇文章里,我们讨论了程序性能的两个方面,一是算法(广义的算法,即解决问题的方法),二是编译器.通过这两个方面,我想表达的意思是,一段程序的执行效率,是很难从表面现象得出结论的,至少从一些简单的层面,如代码的长度是几乎难以说明任何问题--因此一定要进行Profiling才能做到有效的优化.而现在,我们假设两段程序算法基本相同,编译器也只是进行简单的"翻译",那么--我们能从"表面"看出性能高下吗? 那么就从一个最简单的例子看起吧.假设DoSomethingA和D

浅谈代码的执行效率(2):编译器的威力

在上一篇文章中,我主要表达了这样一个观点:影响程序效率的关键之一是算法,而算法的选择与优化,和是否多一个赋值少一个判断的关系不大.关于算法的选择,我谈到其理论上的复杂度,并不直接反映出效率.因为在实际运用时,数据的规模,特征等等都会涉及到算法的实际效果.一个时间复杂度低的算法并不代表任何情况下的效率都高.这是"实际"和"理论"的区别之一.现在我打算来谈一下另一个比较"实际"的东西:编译器对于程序效率的影响. 那么我们先来看这样一段代码,假设有一个

浅谈代码的执行效率(4):汇编优化

终于谈到这个话题了,首先声明我不是汇编优化的高手,甚至于我知道的所有关于汇编优化的内容,仅仅来自于学校的课程.书本及当年做过的一些简单练习.换句话说,我了解的东西只能算是一些原则,甚至也有一些"陈旧"了--不过我想既然是一些原则性的东西,还是能够用它来做一定程度的判断.至少我认为,我在博客园里看到的许多关于"汇编优化"也好,"内嵌汇编"也罢的说法,经常是有些问题的. 说到汇编优化,自然被人想到"高性能".似乎用.NET或Jav

浅谈如何提高编程效率?

浅谈如何提高编程效率?1.提高工作经验 经验来自实践.平时多阅读一些技能方面的书籍和来自各网站上的优秀文章.如果说,一本书就是一个台阶,那么在人的一生中将有千万道台阶等着我去跨越.每跨越一步台阶,将得到不可估量的财富,而下一步台阶,又将带我步入一个新的境界,获取新的知识. 看到学到做到.平时有时间多看看大牛写的代码,多看看开源的项目并参与一些开源项目的编码工作.2.和大牛.勤奋的人一起工作 和大牛有经验的程序猿一起工作.和勤奋的人一起共事.永远不要相信"你改变不了环境,但可以改变自已."

浅谈onTouch先执行,还是onClick执行(详解)

有一个Button 按钮,要想为该按钮设置onClick事件和OnTouch事件 mTestButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Log.d(TAG, "onClick execute"); } }); mTestButton.setOnTouchListener(new View.OnTouchListener() { @Ove

浅谈提升C#正则表达式效率

说到C#的Regex,谈到最多的应该就是RegexOptions.Compiled这个东西,传说中在匹配速度方面,RegexOptions.Compiled是可以提升匹配速度的,但在启动速度上,使用了RegexOptions.Compiled情况下,通常会使启动速度慢许多,据说最多是60倍. 进行一组测试,有测试数据,才有讨论依据. 第一步,帖上测试硬件信息(呵呵,硬件有点烂:() 第二步, a.测试在没有使用RegexOptions.Compiled项时候的情况,随意使用一些内容,然后循环一万

一起谈.NET技术,浅谈提升C#正则表达式效率

说到C#的Regex,谈到最多的应该就是RegexOptions.Compiled这个东西,传说中在匹配速度方面,RegexOptions.Compiled是可以提升匹配速度的,但在启动速度上,使用了RegexOptions.Compiled情况下,通常会使启动速度慢许多,据说最多是60倍. 进行一组测试,有测试数据,才有讨论依据. 第一步,帖上测试硬件信息(呵呵,硬件有点烂:() 第二步, a.测试在没有使用RegexOptions.Compiled项时候的情况,随意使用一些内容,然后循环一万

浅谈PHP 5中垃圾回收算法的演化

PHP是一门托管型语言,在PHP编程中程序员不需要手工处理内存资源的分配与释放(使用C编写PHP或Zend扩展除外),这就意味着PHP本身实现了垃圾回收机制(Garbage Collection).现在如果去PHP官方网站(php.net)可以看到,目前PHP5的两个分支版本PHP5.2和PHP5.3是分别更新的,这是因为许多项目仍然使用5.2版本的PHP,而5.3版本对5.2并不是完全兼容.PHP5.3在PHP5.2的基础上做了诸多改进,其中垃圾回收算法就属于一个比较大的改变.本文将分别讨论P

浅谈SEO优化执行过程中的几点弊端

SEO作为近年来流行于站长界的网络推广.营销方式,正越来越被行业内从业人员的重视.一则是相对大部分传统付费营销方式在费用上的缺省,二则是相对传统免费推广方法在效果上的显而易见. 虽然SEO优化是依附于搜索引擎而生存的网站优化方法,但以其各方面的优势被站长们热力追捧,必定具有其不可抗拒的魅力.早些时候,笔者也曾简单介绍了网站seo优化的原因.其中指出网站为什么要做seo优化的5点原因:1.从搜索引擎获得的流量质量高;2.使网站简单易用,加强用户体验;3.长期有效的推广手段;4.可扩展性强;5.性价