| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
共有 977 人关注过本帖
标题:【周六散分】程序员的烦恼:为性能牺牲代码简洁性值得吗?
取消只看楼主 加入收藏
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:2 
【周六散分】程序员的烦恼:为性能牺牲代码简洁性值得吗?

2015-5-15 23:23:16
来源:csdn
作者:Arne Mertz


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

译文如下:

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

性能≠效率

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

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

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

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

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

性能并非程序的全部

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

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

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

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

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

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

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

性能和简单并不总是矛盾

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

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

小结

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

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

授人以渔,不授人以鱼。
2015-05-16 13:03
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
以下是引用tlliqi在2015-5-16 14:23:55的发言:

性能并非程序的全部

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

授人以渔,不授人以鱼。
2015-05-16 14:43
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
其實作者的觀點很明確,在内文中已經回答標題的問題的,那標題是一個反問句。

授人以渔,不授人以鱼。
2015-05-21 10:23
快速回复:【周六散分】程序员的烦恼:为性能牺牲代码简洁性值得吗?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.032042 second(s), 8 queries.
Copyright©2004-2025, BC-CN.NET, All Rights Reserved