当前位置: 首页 > 面试题库 >

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

欧阳鸿哲
2023-03-14
问题内容

从2010年的计算机语言基准游戏中可以看出:

  • Go平均比C慢10倍
  • Go比Java慢3倍!

考虑到Go编译器会生成要执行的本机代码,这怎么可能?
Go的编译器不成熟?还是Go语言存在一些内在问题?

编辑:
大多数答案否认Go语言的内在缓慢,声称问题出在不成熟的编译器中。
因此,我进行了一些自己的测试来计算斐波那契数:迭代算法在Go(freebsd,6g)中以与sameC(带有O3选项)一样的速度运行。迟钝的递归代码在Go中的运行2 times速度比C慢(使用-O3选项;使用-O0-相同)。但是我还没有看到基准测试中出现10倍的下降。


问题答案:

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

它们旨在快速运行自己并生成可以的代码(有些优化)。gccgo使用GCC的现有优化遍历,并可能与C进行更有意义的比较,但是gccgo尚未完成功能。

基准数字几乎完全与执行质量有关。它们与这种语言没有太多关系,除非实现花费了运行时支持基准测试实际上不需要的语言功能。从理论上讲,在大多数编译语言中,足够聪明的编译器可以剔除不需要的内容,但是您到了要演示的地方,因为很少有真正的语言用户编写不使用该功能的程序
。将事情移开而不完全删除它们(例如,在JIT编译的Java中预测虚拟调用目标)开始变得棘手。

FWIW是我自己用Go进行的非常琐碎的测试(基本上是整数加法循环),gccgo朝着介于C gcc -O0gcc -O2C
之间的范围的高端输出了代码。Go 并不是天生就很慢,但是编译器还不能做所有事情。对于10分钟的语言来说,这不足为奇。



 类似资料:
  • 问题内容: 我一直基于Java的缓慢性而避免使用Java反射soley。我在当前项目的设计中达到了可以使用它的目的,这将使我的代码更具可读性和雅致性,因此我决定尝试一下。 两者之间的差异让我感到惊讶,有时我发现运行时间几乎快了100倍。即使在这个仅实例化一个空类的简单示例中,它也是令人难以置信的。 真的,我的问题是 为什么这么慢?我在做错什么吗?(即使上面的示例也说明了区别)。我很难相信它真的比普

  • 问题内容: 这是所有编程语言所共有的吗?在进行多次打印后再执行println似乎更快,但是将所有内容移动到字符串中并仅进行打印似乎最快。为什么? 编辑:例如,Java可以在不到一秒钟的时间内找到所有高达100万的质数- 但要进行打印,然后在自己的println中将它们全部输出可能需要几分钟!最多可打印100亿小时! 例如: 问题答案: 速度并不慢,而是由主机操作系统提供的与控制台连接的基础。 您可

  • 问题内容: 我对此感到困惑 现在让我们来看看numpy: 神圣的CPU周期蝙蝠侠! 使用改进,但恕我直言仍然不够 numpy.version.version =‘1.5.1’ 如果您想知道在第一个示例中是否跳过了列表创建以进行优化,则不是: 问题答案: Numpy已针对大量数据进行了优化。给它一个很小的3长度数组,毫不奇怪,它的性能很差。 考虑单独的测试 输出是 似乎是数组的归零一直花费在nump

  • 问题内容: Magento通常这么慢吗? 这是我的第一次使用体验,管理面板只需花一些时间即可加载和保存更改。这是带有测试数据的默认安装。 托管该服务器的服务器可超快地服务于其他非Magento站点。Magento使它如此缓慢的PHP代码有什么用,该如何解决? 问题答案: 我只是切身参与优化Magento的性能,但这是系统速度如此缓慢的一些原因 Magento的某些部分使用在MySQL之上实现的EA

  • 问题内容: 在有人质疑使用的事实之前,我先说一下,出于内存和性能的原因,我需要在特定的应用程序中使用它。[1] 因此,到目前为止,我一直使用并假定这是最有效的方法。但是,自古以来我就注意到它是软件的瓶颈。[2] 然后,就在最近,我试图用一个巨大的映射替换,在该映射中放置/获取字符串,以便每次获得唯一的实例。我以为这会慢一些…但是事实恰恰相反!它快得多了!通过推送/轮询地图(实现完全相同)来替换,可

  • 问题内容: 我想迭代地构建稀疏矩阵,并注意到根据SciPy文档,有两种合适的选择: LiL矩阵: 类scipy.sparse.lil_matrix(arg1,shape = None,dtype = None,copy = False)[源]基于行的链表稀疏矩阵 这是用于增量构造稀疏矩阵的有效结构。 DoK矩阵: 类scipy.sparse.dok_matrix(arg1,shape = None