介绍:我是编译编程语言的忠实粉丝,一直都是。虽然解释型编程语言允许开发人员更快地编写和测试代码,但我仍然认为编译器值得长期投资。在我看来,编译代码有两个明显的优势:可以验证对代码的每一次修改,甚至在代码开始运行之前。更快的执行速度。根据具体情况,代码可能会被编译为非常低级的执行指令。之所以要写这篇文章,是想比较一下编译型代码的执行速度比解释型代码快多少。由于我偏爱编译型编程语言,这里有一个问题:我有很多有趣的代码,但都是用Python编写的,我该怎么办?重写所有?部分重写?完全不重写?先入之见在这篇文章中,我通过比较它们在不同任务上的表现来检验我对Java、Go和Python的一些先入之见。首先是Python,我正在考虑更换它。至于Java,我已经成为它的粉丝20多年了,看着它在性能和功能方面不断成熟和完善。最后是Go,我两年前才开始使用它,但真的很喜欢它。Go虽然相比Java少了一些特性,比如类继承,但是它的语法简洁紧凑,编译和执行速度很快,生成的代码也非常紧凑,并且还提供了优雅的goroutines用于并发处理。以下是我的一些先入之见。编译代码的执行速度比解释代码快一个数量级。早些时候,当我比较使用和不使用JIT编译的Java代码的性能时,比率约为30比1。Go运行速度比Java快一点。我记得在我以前的工作中做过一些测试,发现Go在某些任务上比Java快30%,但最近的一些文章说Java比Go快。我们先测试一下。我在之前的文章中通过一些代码对比了JIT的性能,然后用Python和Go实现了。这段代码计算100的斐波那契值,每轮50次,并以纳秒为单位打印执行时间,总共200轮。代码可以在GitHub上找到。三种语言的输出看起来是这样的...1221231168311912215683112104113581201192611911973120104113771091031296012712215683112122126114Java比Go慢的时候看到的是:在计算斐波那契值时,大约慢了24%,而Python几乎慢了100倍,即9458%。这个结果证实了我对Java和Go的初步判断,但让我吃惊的是Python的性能,不仅慢了一个数量级,而是慢了两个数量级!我想知道为什么Python会花这么多时间。我的第一个想法是,很多人关注Python的易用性并牺牲性能来获得快速结果。我相信所有的数据科学家都是这样想的。况且现成的库那么多,何必再找其他的呢?迟早会有人优化它们。第二个原因是很多人没有对比过不同的实现方式,因为很多创业公司都在激烈的竞争中忙着做产品,根本无暇考虑要不要优化。第三个原因,有一些方法可以让相同的Python代码运行得更快。编译Python代码是如何工作的?在做了一些研究之后,我决定使用PyPy测试相同的Python代码。PyPy是Python的另一种实现,它本身是用Python开发的,并且包括一个像Java一样的JIT编译器。和Java一样,我们需要忽略初始输出,跳过JIT编译过程,结果如下:JavaGoPythonPyPy130105100501887PyPy平均响应速度比Python快5倍,但仍然比Go慢20倍。更多测试以上测试主要针对数值的计算。如果回到开头提到的Python代码,我还需要关注:Kafka、HTTP监听器和数据库IO;解析JSON消息。总结本文通过简单的数学运算得出结论,Go的执行速度比Java快一些,比解释型Python快2个数量级。基于这样的结果,我个人不会用Go来代替Java。另一方面,在高负载、关键任务环境中使用Python并不是一个好的选择。如果您遇到这种情况,请考虑使用Python编译器作为短期解决方法。在决定是否重写Python代码时,还有其他因素需要考虑,例如IO和CPU问题,但这些超出了本文的范围。有人提醒我,在Go和Java中使用64位整数只能准确计算出92的斐波那契值,然后就会出现溢出(译者:所以后来改代码计算90的斐波那契值)。但即便如此,本文的结论仍然有效。更多编译技巧阅读原文:https://developer.aliyun.com/...
