| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5157 人关注过本帖
标题:代码的可读性和效率之间,哪个更重要
只看楼主 加入收藏
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:2 
1.頂樓的兩個代碼,實際在效率上沒什麽區別。
2.對具體的第一份代碼而已,那種寫法是C/C++的獨特風格,算不上裝逼,熟悉的人沒問題,而從其他語言遷移過來或要遷移到其他語言的時候,就要用後面的形式,效率如上所言。
3.當要跟蹤p、q變化前後的値時,第一份代碼做不到。

[此贴子已经被作者于2016-2-24 17:34编辑过]


授人以渔,不授人以鱼。
2016-02-24 17:22
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
++、--之類算符,祗在前綴時高效,後綴時實際上也是兩步的。但頂樓那樣的情形,採用前綴形式很難寫得漂亮。有些緊凑的代碼會高效,也會晦澀,與清晰並不排斥,通常以清晰爲先,能在保持清晰的前提下做到緊凑最好,否則應優先清晰,這是優先級的問題。不過,這問題多少屬於意識形態,也有人的價値觀是高效爲先的。

[此贴子已经被作者于2016-2-24 19:36编辑过]


授人以渔,不授人以鱼。
2016-02-24 19:30
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
裝逼的代碼風格是哪種呢?就是明明有直接的、清晰的不寫,偏寫繞彎的、晦澀的,總要讓人看不懂爲止。

授人以渔,不授人以鱼。
2016-02-24 19:35
snailqiu
Rank: 2
等 级:论坛游民
帖 子:59
专家分:45
注 册:2007-9-26
收藏
得分:0 
回复 13楼 TonyDeng
讲的很好
2016-02-24 20:01
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
舉個例子,求素數,很多人這樣寫:
程序代码:
for (i = 2; i <= sqrt(x); i++)
{
}

表面看起來,這很緊凑,然而它實際上是低效的,因爲srt(x)本來是循環中的不變量,此時無需每次循環都調用一次sqrt()函數(這個浮點庫函數其實很慢),如果我們不追求緊凑,就可以用一個臨時變量k把常數値存起來,像這樣:
程序代码:
k = sqrt(x);
for (i = 2; i <= k; i++)
{
}

多了一行,沒那麽緊凑,也多用了一個變量佔內存,但它的效率卻比上面那個高。而且,我們隨時可以檢查k値是多少,瞭解程序實際上執行了多少次循環,在跟蹤器中,是無法查看sqrt(x)値的。這個例子表明,行數少、代碼緊凑,並不表示高效,這是一方面,另一方面,多花一個看起來不必要的臨時變量,對程序的調試有幫助,尤其是把k命名爲有意義的變量名時,更是如此,這就叫清晰性。很多人愛在一行上寫太多太複雜的表達式,以為那是高效,其實是給自己排查錯誤制造麻煩,何況那也不清晰,讀者不需要琢磨你的表達式,他祗要知道你的表達式幹什麽,你用一個名字告訴他就可以了,如果有問題,他會再深入去看表達式,沒人有空去琢磨的。

[此贴子已经被作者于2016-2-24 20:58编辑过]


授人以渔,不授人以鱼。
2016-02-24 20:50
q201q5
Rank: 1
等 级:新手上路
帖 子:14
专家分:3
注 册:2016-2-23
收藏
得分:0 
回复 15楼 TonyDeng
对于现代的编译器,
k = sqrt(x);
for (i = 2; i <= k; i++)
{
}

for (i = 2; i <= sqrt(x); i++)
{
}
不会有区别的。sqrt这样的函数应该叫做纯函数,也就是说返回值值只和输入值有关,只要输入参数一定,输出的结果不管什么时候计算都一样。对于gcc,这样的函数可以这样来声明 double sqrt(double) __attribute__ ((__pure__));如果开优化的话这两者的性能完全一样,但下面的看起来确实要紧凑些。
2016-02-25 00:39
q201q5
Rank: 1
等 级:新手上路
帖 子:14
专家分:3
注 册:2016-2-23
收藏
得分:0 
如果循环里面的i如果只用做计数,那么上面的函数这样写可能性能比较高
  if (x > 3)
  {
    for (i = sqrt (x) - 1; i-- > 0; )
    {
    }
  }

如果只是像上面说的简单的求素数,i自增的效率要高;如果i只用来计数,自减效率可能会高些。有一些机器有计数寄存器,循环判断+自减+跳转一步完成。


[此贴子已经被作者于2016-2-25 00:50编辑过]

2016-02-25 00:44
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
我举的例子并没说sqrt(x)中的x一定能推断出是常数。

授人以渔,不授人以鱼。
2016-02-25 02:48
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
回复 15楼 q201q5
这就叫绕圈

授人以渔,不授人以鱼。
2016-02-25 02:49
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
优化的最佳途径是改数据结构和算法,不是靠编译参数和语法、甚至独特语法,写出太多的底层指引只是增加独特性。算法的效率,可能随着数据规模的变化而变化,没有固定最优,像上面说的sqrt()问题,就是在x较大时暴露出来,否则不需要在意。代码如何写,考虑的因素很多,并非总是效率,清晰性、可读性、可维护性,都要综合考虑。当一段代码要考虑优化的时候,通常表明算法本身有问题,解决方案不是小打小闹——既要避免不必要的优化,也要避免不必要的劣化。

杜甫写诗,要给普通老太读得懂,不是只有诗人懂,C人也一样,给不是C程序猿看看。

btw:求素数最快的是查表法,不是计算法,不需“技术含量”。

[此贴子已经被作者于2016-2-25 03:32编辑过]


授人以渔,不授人以鱼。
2016-02-25 02:59
快速回复:代码的可读性和效率之间,哪个更重要
数据加载中...
 
   



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

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