代码之家  ›  专栏  ›  技术社区  ›  Oleg Razgulyaev

为什么这么慢(与Java相比)?

  •  105
  • Oleg Razgulyaev  · 技术社区  · 16 年前

    我们可以从中看到 The Computer Language Benchmarks Game 2010年:

    考虑到Go编译器生成本机代码来执行,这是怎么做到的呢?
    不成熟的编译程序?或者Go语言存在一些固有的问题?

    编辑:
    大多数答案否定了Go语言固有的缓慢性,声称问题存在于不成熟的编译器中。
    所以我自己做了一些测试 to calculate Fibonacci numbers :迭代算法在go(freebsd,6g)中运行 same 以C为单位的速度(带O3选项)。单调的递归的一个在go中运行 2 times 比C慢(使用-O3选项;使用-O0-相同)。但我还没有看到基准游戏中的10倍下降。

    11 回复  |  直到 7 年前
        1
  •  99
  •   YeahStu    16 年前

    6G和8G编译器并不是特别优化,因此它们生成的代码不是特别快。

    它们的设计是为了运行得更快,并生成一些正常的代码(有一些优化)。 gccgo 使用GCC现有的优化过程,并可能提供与C更为重要的比较,但GCCGO还没有完成功能。

    基准数据几乎完全与实施质量有关。它们与语言没有太大的关系,除非实现花费运行时来支持基准测试真正不需要的语言功能。在大多数编译语言中,一个足够聪明的编译器理论上可以去掉不需要的东西,但是有一点是你在操纵演示,因为很少真正的语言用户会编写不使用该特性的程序。将事物移开而不完全移除它们(例如,预测JIT编译的Java中的虚拟调用目的地)开始变得棘手。

    fwiw是我自己的一个非常简单的测试,当我查看它(基本上是一个整数加法的循环)时,gccgo生成的代码接近于 gcc -O0 gcc -O2 对于等价的C.Go来说,它并不是天生的慢,但是编译器并没有做任何事情。对于一种只有10分钟的语言来说,这并不奇怪。

        2
  •  50
  •   igouy peenut    7 年前

    在下一个版本的 Go FAQ ,应显示类似于以下内容的内容。

    性能

    为什么Go在基准测试中表现不佳 X?

    Go的设计目标之一是 接近C的性能 可比项目,但在一些 基准测试结果很差, 包括几个试验/试验台。这个 最慢的取决于图书馆 可比性能的版本为 在Go中不可用。例如, pidigits依赖于多精度 数学包和C版本, 与Go不同的是,使用gmp 在优化的汇编程序中)。基准 这取决于正则表达式 (例如,regex DNA)是 本质上比较了Go的权宜之计 regexp包成熟,高度 优化的正则表达式库 像PCRE。

    基准游戏是由广泛的 大多数 基准需要注意。如果你 测量可比较的C和GO程序 (反向补码就是一个例子) 你会发现这两种语言很多 比这更接近原始性能 套房会显示。

    不过,还有改进的空间。 编译程序很好,但可能 更好的是,许多图书馆需要专业 性能工作,以及垃圾 收藏家还不够快(甚至 如果是,小心不要 产生不必要的垃圾 巨大的影响)。

    这里还有一些关于 The Computer Benchmarks Game 来自最近的邮件列表线程。

    Garbage collection and performance in gccgo (1)

    Garbage collection and performance in gccgo (2)

    重要的是要注意,计算机基准游戏只是一个游戏。在性能度量和容量规划方面有经验的人会谨慎地与like进行匹配,就像在现实和实际的工作负载上一样;他们不会玩游戏。

        3
  •  33
  •   Darshan Rivka Whittle Marek Lipka    14 年前

    我的答案并不像其他人的答案那么技术化,但我认为它仍然是相关的。 当我决定开始学习Go时,我在计算机基准游戏上看到了相同的基准。但老实说,我认为所有这些综合基准对于决定Go是否足够快对您来说都是毫无意义的。

    最近我使用tornado+tornadio+zmq在python中编写了一个消息服务器,对于我的第一个go项目,我决定在go中重写该服务器。到目前为止,我已经使服务器具有与Python版本相同的功能,我的测试显示Go程序大约提高了4.7倍的速度。请注意,我在Go中只进行了一个星期的编码,而且我用Python编码已经5年多了。

    Go只会在他们继续处理它的时候变得更快,我认为实际上它取决于它在实际应用程序中的表现,而不是微小的计算基准。对于我来说,Go显然产生了一个比我在Python中所能产生的更高效的程序。这是我对这个问题的回答。

        4
  •  6
  •   Taavi metakeule    7 年前

    事情变了。

    我认为现在对你的问题的正确答案是反驳“走得慢”的观点。在你询问的时候,你的判断是合理的,但是Go在表现方面获得了很多支持。现在,它仍然没有C快,但在一般意义上,它不是接近10倍慢的地方。

    Computer language benchmarks game

    在撰写本文时:

    source  secs    KB      gz      cpu     cpu load
    
    reverse-complement
    1.167x
    Go      0.49    88,320  1278    0.84    30% 28% 98% 34%
    C gcc   0.42    145,900 812     0.57    0% 26% 20% 100%
    
    pidigits
    1.21x
    Go      2.10    8,084   603 2.10    0% 100% 1% 1%
    C gcc   1.73    1,992   448 1.73    1% 100% 1% 0%
    
    fasta
    1.45x
    Go      1.97    3,456   1344    5.76    76% 71% 74% 73%
    C gcc   1.36    2,800   1993    5.26    96% 97% 100% 97%
    
    regex-dna
    1.64x
    Go      3.89    369,380 1229    8.29    43% 53% 61% 82%
    C gcc   2.43    339,000 2579    5.68    46% 70% 51% 72%
    
    fannkuch-redux
    1.72x
    Go      15.59   952 900 62.08   100% 100% 100% 100%
    C gcc   9.07    1,576   910 35.43   100% 99% 98% 94%
    
    spectral-norm
    2x
    Go      3.96    2,412   548 15.73   99% 99% 100% 99%
    C gcc   1.98    1,776   1139    7.87    99% 99% 100% 99%
    
    n-body
    2.27x
    Go      21.73   952 1310    21.73   0% 100% 1% 2%
    C gcc   9.56    1,000   1490    9.56    1% 100% 1% 1%
    
    k-nucleotide
    2.40x
    Go      15.48   149,276 1582    54.68   88% 97% 90% 79%
    C gcc   6.46    130,076 1500    17.06   51% 37% 89% 88%
    
    mandelbrot
    3.19x
    Go      5.68    30,756  894 22.56   100% 100% 99% 99%
    C gcc   1.78    29,792  911 7.03    100% 99% 99% 98%
    

    不过,在二叉树基准测试中,它确实遭受了巨大的损失:

    binary-trees
    12.16x
    Go      39.88   361,208 688 152.12  96% 95% 96% 96%
    C gcc   3.28    156,780 906 10.12   91% 77% 59% 83%
    
        5
  •  5
  •   DLopes    8 年前

    尽管对CPU周期使用的效率不高,但是GO并发模型比Java中的线程模型快得多,并且可以与C++线程模型相媲美。

    注意在 thread-ring benchmark ,开始是 16X 比Java快。在相同的情况下,Go-CSP几乎可以与C++相媲美,但是使用4X更少的内存。

    Go语言的强大功能是它的并发模型、通信顺序进程、CSP,由TonyHoare在70年代指定,易于实现并适合高度并发的需求。

        6
  •  1
  •   Curtis Paul    12 年前

    归根结底,需要多长时间来编写代码,而从开发的任何代码中获得最佳性能所需的工作又是多么少。其他的一切只是一种无聊的追求,与商业没有太大的关联……诸如此类。

    Go使开发出色的服务更容易支持。爪哇…不管它的技术能力……梦魇来支持…

    我写了一些Golang程序……就像一只鹅的粪便一样……而且如果我的任务是整天用严肃的数学来压缩……我不认为我会用Java或者去……我会用这样的语言设计的。

        7
  •  1
  •   robert engels    7 年前

    有两个基本原因,即Java比GO和C++更快,并且在很多情况下可以比C快。

    1)JIT编译器。它可以基于运行时配置文件,通过多个级别(甚至是OO类)内联虚拟函数调用。这在静态编译语言中是不可能的(尽管基于记录的配置文件的更新的重新编译可以帮助)。对于大多数涉及重复算法的基准来说,这是非常重要的。

    2)总承包商。与malloc相比,基于GC的内存分配几乎是空闲的。而且“免费”的惩罚可以在整个运行时进行分摊-经常被跳过,因为程序在需要收集所有垃圾之前终止。

    有成百上千个?使GC/JVM高效的非常有才华的开发人员。认为你能“比所有代码都好”是愚蠢的。这是人类内心的一个自我问题——人类很难接受这样一个事实:通过有天赋的人类的适当训练,计算机将比编程的人类运行得更好。

    顺便说一下,如果你不使用和使用OO特性,C++可以和C一样快,但是在C语言中,你非常接近于只开始编程。

    最重要的是,这些测试中的“速度差”通常毫无意义。IO成本比性能差异大几个数量级,因此即使是在解释语言中,适当的设计也能将IO成本降到最低。很少有系统受CPU限制。

    最后一点,人们将“计算机语言基准游戏”称为“科学措施”。例如,如果查看NBORD的Java测试,测试是完全有缺陷的。当我在同一操作系统/硬件上运行测试时,我得到大约7.6秒的Java,4.7秒的C,这是合理的-而不是4X慢测试报告。它是点击诱饵,伪造新闻,旨在产生网站流量。

    最后,最后一个音符…我用Go运行测试,时间是7.9秒。事实上,当你点击Go时,它会将它与Java进行比较,当你点击Java时,它会将它与C进行比较,对任何严肃的工程师来说应该是一个红旗。

    对于一个真实世界的Java、GO和C++的比较 https://www.biorxiv.org/content/10.1101/558056v1 扰流板警报,Java表现出来的原始性能,随着组合内存使用和墙时间走出来。

        8
  •  0
  •   R.Moeller    9 年前

    我认为一个经常被忽视的事实是,JIT编译可以是静态编译,特别是对于(运行时)后期绑定的函数或方法。Hotspot JIT在运行时决定要内联哪些方法,它甚至可以根据当前运行的CPU的缓存大小/体系结构调整数据布局。 C/C++通常可以通过直接访问硬件来弥补(并且总体上仍然会更好)。与C相比,for-go的高级版本可能看起来有所不同,但目前缺少运行时优化系统/编译器。 我的直觉告诉我,走吧 能够 Java越快,Go就越不执行指针跟踪,并鼓励更好的数据结构局部性+更少的分配。

        9
  •  0
  •   user9826550    7 年前

    C++之所以存在,是因为它很优雅,给了您更多的抽象,在C之上,具有零运行时性能和内存蓝图成本。零 Go的存在是因为它很好,有很多原因,太多了,无法在这里分享。但是,如果运行时性能处于其他即兴创作(python)的水平,那么谢谢,但不谢谢!

    现在证明这一切都是宣传:我的加拿大兄弟说:我和汤姆森曾经等待C构建45分钟,数百万次等待源代码。到现在为止,一直都还不错。但是那些行已经被写了,而坏代码就是坏代码(因为他还抱怨调试堆栈损坏有多困难,您可以这样命名)。现在我的QED问题很简单。谁来编写这数百万行Go代码,以便愉快地享受更快的构建时间????如果表现平庸,我告诉你是谁。没人!也许有些男孩从运行时性能不相关的系统中获利。但我想和你分享一个简单的秘密:快就是好,慢就是坏。

    我称巨蟒为即兴创作,并将银河系中缺乏任何来自2.x对3.x的专业线索,当你导入它时,ZenZero应该说:编译器是你的朋友!

    不是说我是一个编译器工程师,但是,类型安全是不可谈判的,不是我所知道的,不是在现实生活中。非程序员可以在他们的小脚本中到处享受它,但对于我们其他人来说,这是一个公理,它会一直这样,直到时间结束。我相信。

    从非软件来源获得收入的公司,嗯,他们可以负担像“go”这样的宠物项目,但我向你保证,如果他们确实依赖于运行时性能(例如,像Amazon一样),他们甚至一秒钟也负担不起(同时发生了数百万笔交易)。

    为什么库伯奈特是一罐蠕虫????如果Go如此干净… 为什么戈罗提内斯系统(理论上很好)如此缓慢和笨重????如果它是如此好,为什么它需要来自更传统线程的不明显的帮助器(信号量、互斥体、您命名它)。我个人认为这是神圣的,但科幻小说,就像优化Go编译器,它不会优化任何东西(主要是因为人们无法优化数学上未确定的概念,这是由最终用户/程序员在非软件公司设计语言/阅读:内部编程导致的)对于谷歌)

    关于Java的事情也一样。许多人使用蓝领语言/妥协,因为他们不了解任何更好的东西。

    Java和C语言有模板吗????问安德斯,非市场营销的答案不是他们没有。只有C++和Delphi这样做。他们有的是糖衣铸件。没有什么比这更重要了。

    有人知道堆栈机器代码(Java,C语言)在运行时的质量差异(运行时性能)和注册代码吗????是2倍

    为什么需要垃圾收集器????因为他们有太多的垃圾。一个人能在爪哇和C中泄漏记忆吗?(当然,去)——当然。

    而且,尽管静态链接很好(对于内部/周日编程/作为一种爱好),但结果的可执行文件大小是侮辱性的(我相信)

    而且,缺乏OOP????你开玩笑吧。就像90年代微软的孩子们,教大家如何编写真实的软件(如com、dcom),因为实现继承对你不利……是啊

    我不相信谷歌有(或有能力)一个真正的语言作家在斯特劳斯集团层面,他们可能负担得起一个安德斯(顺便说一句,这不是为了销售,至少你们一起做了一个Traspiler Thingie),这不是我们所说的缺乏资金,这是缺乏共同点。SE和Real需要谷歌(以及其他许多公司,苹果将是一个完美/甚至更好的例子)来实现这一目标。另外,现实生活中的语言是谦卑的,思考C的,思考对象Pascal(不介意)和C++的。谦逊和不可言喻的天才。关于无法雇佣一个现实生活中的优化工程师(这是更不可能的,因为生来破碎的东西无法优化)。不要相信我,带上一万亿只猴子,基因改造它们,好好喂养它们,让它们快乐,给它们纸和笔,一百万年。他们会写多少首莎士比亚的十四行诗?零

    现在就在这里

    但是,现在与其他(愚蠢的)巨人结盟,用自己的语言来创造自己的语言是很时髦的…我很喜欢Go的很多想法,绝对非常尊重Google,但这并不能让我盲目。

    晚安,大家好,现在是凌晨2:40,还在等着我那愚蠢的谷粒去做(就像他们说的…:-)哈哈

    做个好人

        10
  •  -2
  •   user9826550    7 年前

    你们都在这里谈论理论。设计目标,围棋程序都设计得很好,等等(主要是胡言乱语,说起来很便宜,相信我!) 去是(不幸的)像通往地狱的路,用良好的意图铺就。我们讨论的是运行时性能,而不是编译时性能或链接时性能。为了达到编译时的性能,优化编译器根本没有进行优化,让我们忘记OOP(在那一章,很有趣,这里是LOL)和预处理器的不足。但说得够多了。让我们做一个简单的任务。按顺序生成惊人的200000个质数。好啊?

    让我们看看C,C++和GO代码,如果你想要的话,我可以添加Java和C代码。你自己建造它们,运行它们,然后从那里出发。这是具体的,而不是编程期刊和/或谷歌营销的童话故事。

    这是代码(C,C++,C,Java,PASCAL,GO),你也要装配吗?我想这会很丢脸,对吧?)

    https://drive.google.com/file/d/1SFkAY5TLUIPULm78SxJrQd3qfpHQDGsf/view?usp=sharing

    https://drive.google.com/file/d/1RHQQXcyFul_ekSy6iXhVsdh_CeRlCk-g/view?usp=sharing

    https://drive.google.com/file/d/1d6ZHLut9ANmuA79S1vkC_djtp841ORP9/view?usp=sharing

    https://drive.google.com/file/d/1b9lNfZWJOP6PnNuaXCTu1-szVZC4957h/view?usp=sharing

    https://drive.google.com/file/d/1IEaAtivk0mV6zQW15fIQeJssxBjrtFzd/view?usp=sharing

    最后开始:

    https://drive.google.com/file/d/1f9J33LeptagXGlRuzMzH-FeJOwZcMrpE/view?usp=sharing

    构建它们,然后运行它们,没什么花哨的,只是最初的200000个素数,基本计算,不是基于算法优化,只是简单的代码,比较

    GO大约是一个数量级(十倍)慢于C/C++,大约是Java&C;C的5倍。当然可以使用-o3,随意使用任何你喜欢的go编译器,对于pascal,你可以使用-o4,同样的东西…

    对于我们其他人来说,这还不够好,因为google男孩(比如go的作者)构建了数十亿行毫无意义的设计糟糕的C应用程序,好吧,也许go是有用的。

    现在,关于使用围棋程序所产生的劣质(蠕虫的罐头),这里有一个链接,来自谷歌自己的科技教育电影,来自YouTube,他们自己的平台,对吧?

    10000英里高空,营销孟买巨无霸:

    https://www.youtube.com/watch?v=f6kdp27TYZs&t=187s

    现在,现实生活的例子,现实:

    https://www.youtube.com/watch?v=QDDwwePbDtw&t=1680s

    看,这是一罐多么不安全的虫子。如果你不相信这个人,他们最好的人,那么我不知道你会相信谁。只是看看。在建造和测量之后,既然你应该是工程师而不是廉价的谈话记者,对吗?

    丹出去了

        11
  •  -5
  •   Bill C    13 年前

    Java和C的数据和方法(函数)定义更加明确。C是静态类型的,而Java的继承模型则不那么静态。这意味着数据的处理方式在编译过程中已经有了很大的定义。

    Go的数据和函数定义更加含蓄。内置函数在本质上更一般,缺少类型层次结构(如Java或C++)会带来速度劣势。

    记住,google对于go语言的目标是在执行速度和编码速度之间达成一个可接受的折衷。我认为他们在早期的尝试中达到了一个很好的最佳位置,而且随着更多的工作的完成,情况只会有所改善。

    如果将Go与主要优点是编码速度的动态类型语言进行比较,您将看到Go的执行速度优势。Go比Perl快8倍,比Ruby1.9和Python3快6倍。

    不管怎样,最好的问题是,在编程的易用性和执行的速度上达成一个好的折衷方案?我的回答是肯定的,应该会好起来。