编写更短的代码/算法,效率更高(性能)?

时间:2010-03-08 06:58:12

标签: performance

在网站周围遇到代码高尔夫琐事之后,显然人们试图找到编写代码和算法的方法,尽可能短的字符,线条和总大小,即使这意味着写下这样的东西:

    //Code by: job
    //Topic: Code Golf - Collatz Conjecture
    n=input()
    while n>1:n=(n/2,n*3+1)[n%2];print n

作为初学者,我开始怀疑尺寸是否真正重要:D

这显然是一个非常主观的问题,高度依赖于所使用的实际代码,但现实世界中的经验法则是什么。

如果尺寸不重要,那么为什么我们不关注性能而不是尺寸呢?

11 个答案:

答案 0 :(得分:18)

我希望这不会成为一场火焰战争。好的代码有很多属性,包括:

  1. 正确解决用例。
  2. 可读性。
  3. 可维护性。
  4. 性能。
  5. 可测试性。
  6. 低内存签名。
  7. 良好的用户界面。
  8. 复用性。
  9. 在21世纪的编程中,代码的简洁并不重要。在记忆非常稀缺时,它更为重要。有关引用上述属性的图书,请参阅this question,包括我的回答。

答案 1 :(得分:8)

关于什么是重要而不是什么,已经有很多好的答案。在现实生活中,(几乎)没有人会像代码高尔夫,缩短的标识符,最小的空白以及尽可能少的语句一样编写代码。

也就是说,“更多代码”确实与更多错误和复杂性相关联,“更少代码”往往与更好的可读性和性能相关联。所以所有其他条件相同,争取更短的代码是有用的,但只是在“这些简单的30行代码与100条复杂的代码行相同”的意义上。

答案 2 :(得分:6)

编写“代码高尔夫”解决方案通常与显示你是如何“聪明”地以最简洁的方式完成工作,即使以牺牲可读性为代价。然而,通常,更详细的代码(包括例如功能结果的记忆)可以更快。代码大小对性能很重要,较小的代码块可以适合L1 CPU高速缓存,但这是优化的极端情况,更快的算法总是更好。 “Code Golf”代码与生产代码不同 - 总是为了清晰起见而编写代码。如果包括你自己在内的任何人打算再次阅读该代码,那么解决方案的可读性而不是简洁性。

答案 3 :(得分:4)

空白对性能没有影响。所以像这样的代码只是愚蠢(或者高尔夫分数可能基于字符数?)。尽管语句数量可以产生影响,但行数也没有影响。 (例外:python,其中空格很重要)

然而,效果很复杂。发现必须向函数添加语句以提高其性能并不罕见。

然而,在不知道其他任何事情的情况下,打赌更多的语句是更大的目标文件,更慢的程序。但是更多的除了使代码更具可读性之外没有做任何其他事情(之后添加更多行会降低其可读性;)

答案 4 :(得分:4)

我不相信Code Golf有任何实际意义。在实践中,可读代码是重要的。这本身就是一个相互冲突的要求:可读代码应该简洁,但仍然易于理解。

但是,我想以不同的方式回答你的问题。通常,有快速而简单的算法。但是,如果速度是最重要的,那么事情就会变得非常复杂(并且结果代码会更长)。我不相信简单等于速度。

答案 5 :(得分:3)

表现有很多方面。例如,可以通过存储器占用空间,执行速度,带宽消耗,帧速率,可维护性,可支持性等来测量性能。绩效通常意味着尽可能少地花费最稀缺的资源。

当应用于网络时,简洁性能。如果您的网络服务器在每个页面上提供一个小的JavaScript代码段,那么保持变量名称简短并不会造成严重损害。拉起www.google.com并查看来源!

有些时候DRY没有帮助表现。一个例子是微软发现他们不希望循环数组,除非它大于3个元素。 String.Format has signatures表示一个,两个和三个参数,然后是数组。

有很多方法可以将一个方面换成另一个方面。这通常称为缓存。

例如,您可以交易内存占用以提高执行速度。例如,通过执行查找而不是执行。这只是用大多数流行语言中的[]替换()的问题。如果您计划它以便游戏中的太空船只能在固定数量的方向上进行,那么您可以节省三角函数调用。

或者您可以使用带缓存的代理服务器通过网络查找内容。 DNS服务器一直这样做。

最后,如果开发团队的可用性是最稀缺的资源,那么代码的清晰度是可维护性性能的最佳选择,即使它的运行速度不是很快,或者在代码中非常有趣或“优雅”。

答案 6 :(得分:2)

绝对不是。代码大小和性能(但是你测量它)只是非常松散的连接。更糟糕的是,在一个芯片/编译器/操作系统上,一个巧妙的技巧可能会在另一个架构中做得更糟。

它反直觉,但是一个简单易懂的简单编写通常比一个狡猾的技巧更有效率。今天的优化编译器,如清晰简单的代码,就像人类和复杂的技巧一样,可能会导致他们放弃最佳的优化策略。

答案 7 :(得分:2)

  1. 由于一系列原因,编写更少的代码行往往更好。例如,您拥有的代码越少,错误的可能性就越小。例如参见Paul Graham的文章“Succinctness is Power
  2. 尽管如此,Code Golf达到的水平通常远远超出了合理范围。在Code Golf中,人们正在尝试编写尽可能短的代码,即使他们知道它的可读性较差。
  3. 效率是一个难以决定的事情。我猜测较少的代码通常更有效率,但在很多情况下不是是真的。
  4. 因此,为了回答这个真正的问题,为什么我们甚至会进行Code Golf竞赛,这些竞赛的目标是低字符数,如果这不是一件非常重要的事情呢?

    有两个原因:

    使代码尽可能短意味着你必须既聪明又熟悉一种语言才能找到各种技巧。这使它成为一个有趣的谜语。

    此外,这是用于代码竞争的最简单的措施。例如,效率很难衡量,尤其是使用许多不同的语言,尤其是因为某些解决方案在某些情况下更有效,但在其他情况下更少(大输入与小输入)。可读性:这是一个非常个人化的事情,通常会导致激烈的争论。

    简而言之,我认为没有任何方法可以在不使用“代码短缺”作为标准的情况下进行Code Golf风格比赛。

答案 8 :(得分:1)

这来自“Java开发人员的10条诫命”

  

记住 - “少即是多”并不总是更好。 - 代码效率是一件好事,但是>在许多情况下,编写较少的代码行并不会提高代码的效率。

对于所有编程语言来说(这可能)都是正确的(尽管在汇编中它可能不同)。

答案 9 :(得分:1)

如果您谈论的是小型学术风格的算法或真正的软件,它可以成千上万行代码。我在谈论后者。

Here's an example编写得相当好的程序加速了43倍,代码大小减少了4倍。

“Code golf”只是挤压代码,就像把本科生塞进电话亭。我所说的是通过以声明性的形式重写代码来减少代码,比如特定于域的语言(DSL)。因为它是声明性的,所以它更直接地映射到它的需求上,所以它不会因为只为了实现而存在的代码而膨胀。该链接显示了这样做的一个例子。 This link显示了一种以类似方式减小UI代码大小的方法。

通过避免做那些真正必须完成的事情来实现良好的性能。当然,当你编写代码时,你并不是故意让它做不必要的工作,但如果你像那个例子那样进行积极的性能调整,那么你会惊讶于你可以删除的东西。 / p>

答案 10 :(得分:1)

代码高尔夫的目的是优化一件事(源长度),可能会牺牲其他一切(性能,可理解性,稳健性)。如果你不小心改善了侥幸的表现 - 如果你可以通过加倍运行时间来削掉一个角色,那么你就可以。

你问“我们怎么不关注性能而不是大小”,但问题是基于错误的前提,即程序员更多地关注代码大小而不是性能。他们没有,“代码高尔夫”是少数股权。这很有挑战性和乐趣,但并不重要。查看标记为“code-golf”的问题数量与标记为“性能”的数字。

正如其他人所指出的那样,缩短代码通常意味着通过消除重复和隐藏错误的机会使其更容易理解。这通常比跑步速度更重要。但代码高尔夫是一个完全不同的东西,你删除空格,注释,描述性名称等。目的不是让代码更容易理解。