为了提高性能牺牲代码简洁性是否值得?

本文作者Arne Mertz是一位C++狂热份子,有着丰富的开发经验。文中Arne Mertz针对简洁和性能的关系进行阐述,他认为,开发者不到万不得已时千万不要为了性能而牺牲简洁性,要学会使用工具来解决性能问题。

译文如下:

C++的强项之一是能写出非常高性能的代码。那么在实际中,我们该如何把握好性能处理的尺度呢?

性能≠效率

首先要明确的一点是我们必须把性能和效率区分清楚。这两者分别代表什么?

我们能做得多快(性能);

它需要多长时间去完成(效率)。

这看上去好像差不多,但其实不是。举个例子,假设你需要从A点到B点,效率意味着“最短路径”,性能意味着“以跑代走”。因此,即使以博尔特的速度到达终点,虽然高性能,但并不高效—“没有选择最短路径”。

对于程序来说,循环通常会耗费不少时间。这种情况下,性能意味着“单个循环用时越短越好”,效率意味着“尽量降低循环层数”。

性能并非程序的全部

这是很浅显的道理,但往往容易被忽视,特别是程序员新手。在不少编程论坛里,涉及代码性能优化的提问比比皆是。

有个说法是80%的程序运行时间是由约20%代码决定的,还有的说是90%/10%。因此,对于程序来说,关键运算代码可能仅存在于某小部分代码中。所以,如果把精力放在所有代码的优化上,而不重点主攻关键代码,其实是事倍功半的。

我们真的不懂如何写高性能的代码?

事实上,决定程序运行时长主要的因素是指令数的多少,但这不是由我们控制而是由编译器及其优化器所控制的。

优化器种类繁多,除非是该领域的专家,否则很难明白它对代码做了哪些优化工作。优化器可以销毁临时对象,可以内联函数,可以清除更多其它指令。

所以当这些不确定因素存在时,我们还能写出绝对高性能代码吗?如果真的很在意性能,我建议使用工具来辅助完成。

但也不必太悲观。如果有两种或更多的方法来写出同样可读的代码,那么不妨选择最高性能的写法。例如,在不存储结果的情况下,可以使用++iter来代替iter++。

性能和简单并不总是矛盾

影响程序运行时间的另一个重要因素是内存中数据的布局和结构。

补充一点,假如数据的内存布局不优良,那么会造成要花费很多时间来从获取数据,同时会造成指令冗余。

小结

建议默认编写出可读和简单的代码。如果你真的发现存在性能问题并已经找出其位置,那么仍然有很多选择来对此进行处理而不必为了追求快而写出复杂的代码。不到万不得已不要为了性能而牺牲简洁性,同时要学会使用工具来解决性能问题。

那么问题来了,各位网友,你会为了性能而牺牲代码简洁性吗?

推荐阅读:

程序员必须知道的7大基础实用算法及其讲解

程序员必须注意的十大编程禁忌

解析程序员的几个成长阶段

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-09-30 11:15:39

为了提高性能牺牲代码简洁性是否值得?的相关文章

几种提高jQuery性能的代码

1.jQuery对象缓存 如果同一元素被查找多次时,就应该将该jQuery对象缓存起来,不然每次查找都要遍历整个文档. 使用下边的代码做个简单的测试 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.

Java编程提高性能时需注意的地方

最近的机器内存又爆满了,除了新增机器内存外,还应该好好review一下我们的代码,有很多代码编写过于随意化,这些不好的习惯或对程序语言的不了解是应该好好打压打压了. 下面是参考网络资源和总结一些在java编程中尽可能做到的一些地方 1.尽量在合适的场合使用单例 使用单例可以减轻加载的负担,缩短加载的时间,提高加载的效率,但并不是所有地方都适用于单例,简单来说,单例主要适用于以下三个方面 第一,控制资源的使用,通过线程同步来控制资源的并发访问 第二,控制实例的产生,以达到节约资源的目的 第三,控制

EF提高性能

实体框架 5 性能注意事项 作者:David Obando.Eric Dettinger 等 发布时间:2012 年 4 月 1.简介 对象关系映射框架是一种在面向对象的应用程序中提供数据访问抽象的便捷方式.对于 .NET 应用程序,Microsoft 推荐的 O/RM 是实体框架.但任何抽象都要考虑性能. 本白皮书旨在介绍在使用实体框架开发应用程序时的性能注意事项,使开发人员了解能够影响性能的实体框架内部算法,以及提供有关进行调查及在使用实体框架的应用程序中提高性能的提示.网络上有大量很好的有

java内存回收提高性能

这是本人的第二篇文章.通过上一篇文章的总结后,我觉得有必要对java内存回收问题再详细叙述一下.因为大多数javaer估计都是习惯了自己的java编码风格,尤其是对象声明等,想在哪声明就在哪声明,之后就不管了,因为他知道java有一个很好的内存管理机制,那就是GC(垃圾回收机制).其实这对一般的java程序猿来说这是无可厚非的.呵呵...因为我也是这样过来的.然而,随着接触的项目庞大和性能的要求,我们开始审视自己写的代码,看看有没有一些代码需要优化,或者其他编码风格需要改变从而对系统的性能提升有

Java编程 “提高性能” 应尽力做到

除了新增机器内存外,还应该好好review一下我们的代码,有很多代码编写过于随意化,这些不好的习惯或对程序语言的不了解是应该好好打压打压了. 下面是参考网络资源总结的一些在Java编程中尽可能要做到的一些地方. 1. 尽量在合适的场合使用单例 使用单例可以减轻加载的负担,缩短加载的时间,提高加载的效率,但并不是所有地方都适用于单例,简单来说,单例主要适用于以下三个方面: 第一,控制资源的使用,通过线程同步来控制资源的并发访问: 第二,控制实例的产生,以达到节约资源的目的: 第三,控制数据共享,在

使用C# yield关键字来提高性能和可读性

对于”yield”这个关键字我已经见过N次了,直到最近我才知道这个关键字所蕴含的力量.我将在下面展示出一些使用”yield”让你的代码有更高可读性和更好性能的例子. 为了让你对yield有一些快速概览,我首先要展示一个没有使用这个关键字的例子,下面的代码很简单,但在我最近的项目中却很常见 IList<string> FindBobs(IEnumerable<string> names) { var bobs = new List<string>(); foreach(v

JVM GC调优一则--增大Eden Space提高性能

缘起 线上有Tomcat升级到7.0.52版,然后有应用的JVM FullGC变频繁,在高峰期socket连接数,Cpu使用率都暴增. 思路 思路是Tomcat本身的代码应该是没有问题的,有问题的可能是应用代码升级,或者环境改变了,总之Tomcat的优先级排在最后. 先把应用的heap dump下来分析下: jmap -dump:format=b,file=path pid 用IBM的Heap Analyser分析,发现dubbo rpc调用的RpcInvocation对象和taglibs的Si

缓存jQuery对象来提高性能

jQuery使元素的选择变得异常简单,这也是它快速流行起来的一大原因,如果你看刚刚开始使用jQuery朋友写的代码时,会发现很多数人写的代码都在滥用jQuery选择器.   如果你发现同一元素被查找多次时,你就应该将该jQuery对象缓存起来,不然每次查找都要遍历整个文档.这个话题可能显得有点老生常谈,因为这几天写的东西都和调试jQuery代码有关系,所以将这个问题再次说明一下.关于在控制台中打印程序执行时间大家可以参考下使用 console.time() 计算jQuery代码执行时间,我们使用

使用多结果集读取数据减少服务器往返,提高性能

先来谈一下什么是多结果集?以及为什么需要它? 假设我们的一个窗体上有多个控件,需要绑定多个数据源.那么传统情况下,我们可以用不同的命令去读取不同的数据,然后分别绑定.这样做本来无可厚非,但如果从性能上考虑的话,就有改进的必要了. 因为每个单独的命令执行都是需要发生一次服务器的往返的,所以如果能够把数据一次性读取到,统一发给用户程序,再在客户端做单独的绑定,这样的设计可以减少服务器往返次数,提高性能. 以下是一些代码和比较 使用DataReader执行单结果集查询:每次返回一个结果集.(这是传统的