2010-03-08 50 views
13

在网站上围绕代码高尔夫琐事之后,很明显人们试图找到方法来尽可能短地编写字符,线条和总大小的代码和算法,即使这意味着要写如下内容:写更短的代码/算法,更高效(性能)?

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

因此,作为一个初学者我开始怀疑大小是否真的重要:d

这显然是一个非常主观的问题高度依赖于实际的代码中使用了,但什么是拇指在现实规则世界。

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

回答

18

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

  1. 正确解决用例。
  2. 可读性。
  3. 可维护性。
  4. 表现。
  5. 可测性。
  6. 低内存签名。
  7. 良好的用户界面。
  8. 可重用性。

简明的代码在21世纪的编程中并不那么重要。当记忆非常稀少时,它曾经更为重要。请参阅this question,包括我的回答,参考以上属性的书籍。

+0

谢谢!我会给那些书关于主题 – Carlos 2010-03-08 07:13:00

+1

+1这是正确的,简洁今天真的不是那么重要。事实上,它通常会导致一些非常难看的代码(例如嵌套的三元运算符)。 – helpermethod 2010-03-08 08:32:06

+7

我会说t略有不同:简洁只有当它有助于其他一些目标时才有用。例如简洁*可以*增强可读性和可维护性。过分简洁,但同样可以同时破坏两者。 – 2010-03-08 13:18:17

6

编写“代码高尔夫球”解决方案通常与显示您以最简洁的方式完成工作“聪明”,甚至以可读性为代价。但是,通常情况下,更详细的代码(包括例如功能结果的记忆)可能会更快。代码大小可能会影响性能,更小的代码块可以放入L1 CPU缓存中,但这是优化的极端情况,而且更快的算法总是会更好。 “代码高尔夫”代码不像产品代码 - 如果包括你自己在内的任何人曾经打算再次阅读该代码,则始终要写清楚该解决方案的可读性而不是简洁。

4

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

但是,效果很复杂。发现为了提高性能而必须向函数添加语句并不罕见。

还有,不知道别的什么,打赌更多的语句是一个更大的对象文件,和一个更慢的程序。但更线不这样做不是让代码更易读在一定程度上其它任何东西(后增加更多的线路使得它的可读性;)

+0

哦,我明白你的观点。所以重要的是陈述。 python中的空白是如何显着的? – Carlos 2010-03-08 07:16:19

+2

空格在Python中很重要,因为语言设计者认为它应该是。我认为它的目的是使语言更快,更容易编写代码。 – 2010-03-08 07:37:58

+0

@Carlucho - 它实际上是强制执行某种程度的格式标准(即如果你有'if'语句,你*必须*缩进身体) 。它更多地基于最大化易维护性*而不是最初的写作。 – detly 2010-11-02 03:19:25

8

了很多很好的答案,已经有大约什么是对什么是不重要的。在现实生活中,(几乎)没有人会写代码,如代码高尔夫,缩短标识符,最小空白以及尽可能少的语句。也就是说,“更多的代码”确实与更多的错误和复杂性相关联,“更少的代码”往往与更好的可读性和性能相关联。所以所有其他的东西都是相等的,争取更短的代码是有用的,但只是在“这些简单的30行代码与100行复杂的代码行相同”的意义上是有用的。

4

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

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

+4

在某些语言中,它可以向你展示鬼鬼祟祟的创造性的做事方式,而且每过一段时间,你都会发现你喜欢的东西,并且(如果有足够的文档)使你的真实代码更好。这很少见,但它发生了。如果没有其他事情,代码高尔夫球是一种真正了解您的选择语言的方式。 – 2010-03-08 07:25:34

1

这是从“10个诫面向Java开发”

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

对于所有的编程语言(尽管在汇编中它可能不同),这是(可能)是真的。

+1

我不知道那里有10条诫命......还有一个宗教不能受伤。它可以? – Carlos 2010-03-08 08:52:08

+0

对于每天通过网络传输一百万次的代码,这是不正确的。 – Guge 2010-03-08 09:04:29

+0

当我开始用Java编程时,我在Javalobby上找到了这篇文章。从那以后它提醒我评论我的代码,测试它,而不是重新发明轮子等。 – helpermethod 2010-03-08 12:34:24

3

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

当应用于网络时,简洁IS性能。如果您的网络服务器在每个页面上都提供一个小小的JavaScript代码片段,那么保持变量名称缩短并不会令人伤心。拉起www.google.com并查看源代码!

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

有很多方式交易另一方面。这通常称为缓存。

例如,您可以贸易的内存占用的执行速度。例如通过查找而不是执行。这只是在大多数流行语言中用[]替换()的问题。如果您计划使游戏中的飞船只能沿固定数量的方向行进,则可以保存三角函数调用。

或者你可以使用代理服务器与缓存在网络上查找的东西。 DNS服务器一直这样做。最后,如果开发团队的可用性是最稀缺的资源,那么代码的清晰性是可维护性能的最佳选择,即使它的运行速度不够快,或者代码中的代码非常有趣或“优雅”。

+2

对不起,DRY代表什么? – Carlos 2010-03-08 08:39:47

+0

不要重复自己。复制和粘贴代码被认为是愚蠢的,原因很多。 – Guge 2010-03-08 08:54:11

2

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

它的反直觉,但一个清晰,写得简单尽可能implmentation通常远远比一个狡猾的一袋伎俩效率更高。今天的优化编译器就像人类一样清理简单的代码和复杂的诡计可能会导致它们放弃最佳的优化策略。

2
  1. 写出更少的代码行往往会因为一堆原因而更好。例如,您拥有的代码越少,发生错误的可能性就越小。例如参见Paul Graham的文章“Succinctness is Power
  2. 尽管如此,Code Golf所达到的水平通常远远超出了有意义的范围。在Code Golf中,人们试图编写尽可能短的代码,即使他们知道它的可读性较差。
  3. 效率是一个更难以决定的事情。我猜测较少的代码是通常效率更高,但有很多情况下,这不是是真实的。

因此,为了回答真正的问题,为什么我们甚至有Code Golf比赛的目标是低字数?如果这不是一件非常重要的事情?

两个原因:

使代码尽可能短意味着你必须是既聪明,懂得的语言非常好找各种花样。这使它成为一个有趣的谜语。

此外,它是用于代码竞争的最简单的措施。例如,效率很难测量,特别是使用许多不同的语言,尤其是因为某些解决方案在某些情况下效率更高,但其他解决方案更少(大输入vs小)。可读性:这是一件非常私人的事情,经常会引发激烈的争论。

总之,我不认为没有使用“代码短小”作为标准的代码高尔夫球风格比赛有任何方式。

+0

+1提到可读性主要是主观的(而且afaik无法以任何形式衡量)。 – helpermethod 2010-03-08 12:37:11

1

如果您在谈论小型学术风格算法或真正的软件(可能是数千行代码),它会有所不同。我正在谈论后者。

Here's an example其中一个写得很好的程序加速了43倍,代码大小减少了4倍。

“代码高尔夫”只是挤压代码,像填充本科生到电话亭。我正在谈论通过以声明式的形式重写代码来减少代码,如域特定语言(DSL)。由于它是声明性的,因此它更直接地映射到它的需求,所以它不会被仅仅为了实现而存在的代码膨胀。该链接显示了这样做的一个例子。 This link以类似的方式显示了一种缩减UI代码大小的方法。

良好的表现是通过避免做不要真的必须完成。当然,当你编写代码的时候,你不是故意的使它做了不必要的工作,但是如果你在这个例子中进行了积极的性能调整,你会惊讶于你可以删除的东西。

1

高尔夫球场的代码点是针对一件事情(源长度)进行优化,其他一切(性能,可理解性,鲁棒性)的潜在代价。如果你不小心提高性能,那就是侥幸 - 如果你可以通过加倍运行时间来消除一个字符,那么你会。

你问“为什么我们不把注意力集中在性能上而不是大小上”,但问题是基于一个错误的前提,即程序员更关注代码大小而不是性能。他们没有,“编码高尔夫”是少数利益。这是充满挑战和乐趣的,但并不重要。查看标记为“code-golf”的问题数量与标记为“performance”的数字相比较。

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