关于哪种语言速度执行速度最快,画了张图表,顺带吐槽

2021-05-16 05:48:27 +08:00
 LeeReamond

起因:昨天论坛老哥分享 Python 性能提升计划,其中一些涉及性能的讨论,27 楼老哥自己画了个图表看起来挺不错的。原贴链接

我个人是因为对 python 性能提升很感兴趣,对其他语言的语言性能比较也很感兴趣,有大版本更新的时候都会搞一些简单算法看看到底快了多少。这回看到这个老哥的图感觉挺不错的,该老哥称自己定期爬取 the benchmarks ganme 画出来的图,我感觉不如直接搞成一个自动维护项目,以后也省得手贱再自己动手跑了。

鼓捣了一下,大概思路就是基于 github 的分发特性,一个图片链接可以一直保持在最新数据,然后我在原版数据的基础上添加了两个 python 的 jit 解释器( pypy 和 pyston ),最后结果如下:

数据来源 https://benchmarksgame-team.pages.debian.net/benchmarksgame/index.html

=====================

几点说明:

1 、语言性能讨论一直是引战话题,我不是很理解为什么有人会在这个问题上被摸到 G 点,为了避免被喷,我先声明我这个不是严谨性能测试,只是基于开源跑分的爬虫并绘制图表而已。这个项目产生的原因是希望为需要的人提供一些定性结论(或者是定性结论的参考,毕竟它有可能不准),而不是严谨的定量结论。

2 、以前虽然跟别人讨论经常引用 the benchmarks game 的结论,但从来没仔细研究过这个网站。这次顺带仔细看了一下算法,我觉得它这些设计有几个可能本身也并不严谨。本身对比语言性能就是很难设计的一件事,理解。

3 、我在做这张图表的时候遇到一个统计学问题,由于一张图里要汇总多项测试的平均水平,一个最简单的想法是求平均耗时。但是需要考虑到一种极端情况就是,假设大部分测试都以非常短的耗时(比如 10 秒以内)完成,而个别测试极端情况的项目的总体时间消耗都很高(比如超过 600 秒),那么如果单纯做加和的话,整体的平均值会很大程度上取决于这个极端情况的结果,而削减了其他项目的影响力,为了避免这种情况发生,需要对数据加权。

我的方案是采用了如下图所示的运算得到最终结果,其中σ是方差,L 是常数,V 代表输出值。

大体思路就是,当一个项目整体测试时间较长的时候,我们会略微削弱这个项目的权重,让他不要影响那么大。同时考虑到如果用离散度描述整体测试时间的跨度,方差的比例差可能是一个非常大的数,所以需要进行某种压限,以确保权重最低的项目不会比权重最高的项目低出太多。算法是拍脑袋想的,有兴趣的欢迎看源码,或提意见。

4 、the benchmarks game 这个网站算是比较熟了,隔一段时间总会看到,但是说实话这次跑出来比例挺多反常识的,大概有以下几点:

我后面手动检查了一下数据,应该不是我写错了,确实测试结果加权平均算下来就是这样的,可能是由于这个跑分本身也没那么严谨,或者是特定语言在一些大量使用场景(比如正则)有让效率接近原生级的优化所导致的。

6430 次点击
所在节点    分享创造
44 条回复
Leviathann
2021-05-16 06:07:25 +08:00
ghc 好强啊
woodfly
2021-05-16 06:16:00 +08:00
我觉得计算时间排名的时候,可以把各个单项测试的时间全部折算成 C++运算时间的倍数,然后求各个测试成绩的平均值作为该语言的成绩。
pkookp8
2021-05-16 06:39:09 +08:00
为什么 c++比 c 快,打破了我的直觉
hoyixi
2021-05-16 07:26:55 +08:00
Ruby 慢是早就存在的业界共识
noe132
2021-05-16 07:52:46 +08:00
js 经过 jit 优化后的代码效率非常高,和 native 属于一个梯度的,和编译语言性能不会拉开太大差距。当然要代码质量高,能够被优化才行
des
2021-05-16 08:36:43 +08:00
和我预期不一样
PHP 这么快,lua 这么慢?
plko345
2021-05-16 08:42:21 +08:00
py3 比 py2 慢这么多?为什么,原理是啥?不是质疑,就是好奇
stephenyin
2021-05-16 08:49:16 +08:00
pyston 是啥?
voiyy
2021-05-16 09:04:13 +08:00
这个网站的数据并不是很准,rust 好多代码还是调用优化的 c 库,然后跟 c 手写的算法比跑分
SuperMild
2021-05-16 09:24:15 +08:00
符合我的印象,Java 比 Go 快一丁点,Go 比 V8 快一丁点,(但如果看内存占用,Go 会比 Java 少很多,也比 Node 少一些),Ruby 垫底,Python 比 Ruby 快一丁点(但也非常慢),但 Python 很多时候会通过调用 C 来提高速度,因此现实中 Python 还是很堪用。
aristolochic
2021-05-16 09:57:47 +08:00
@SuperMild 其实 Ruby 也是,而且应用广泛到在 Windows 上都不好装(因为要编译
毕竟 Ruby 和 Python 都用的是 libffi,而且 libffi 的 gem 封装 ffi 还可以适用于 JRuby 和 Rubinius
( libffi 用的实在太广泛了

除了拉原生扩展这个外援之外,动态语言还是比比什么抽象表达能力、类型标注什么的比较带劲
046569
2021-05-16 10:12:21 +08:00
https://benchmarksgame-team.pages.debian.net/benchmarksgame/fastest/ruby-python3.html

以 LZ 引用的同一站点页面为例,Ruby 的速度是 Python 的多少倍:

n-body:2.4
binary-trees:2.1
fannkuch-redux:1.9
fasta:1.4
spectral-norm:1.0
reverse-complement: 0.6
mandelbrot:0.6
k-nucleotide:0.6
pidigits:0.6
regex-redux:0.1

换句话说,Python 的最大优势项目速度是 Ruby 的十倍,而 Ruby 的最大优势项目速度是 Python 的二十四倍。

LZ 的加权算法导致结果有失公允。
hronro
2021-05-16 10:39:21 +08:00
@des #6 最近 PHP 性能进步不小,Lua 这里应该用的是原版 Lua 而不是 LuaJIT 。
hronro
2021-05-16 10:40:25 +08:00
确实楼主的加权合不合理还有待商榷,建议楼主可以做加权和不加权的两个版本
Anybfans
2021-05-16 10:44:05 +08:00
@plko345 #7 不是 py2 是 pyston 吧
des
2021-05-16 10:52:09 +08:00
@hronro
php 是 jit 的原因吗?我怎么记得有人说 php jit 提升不大?
hronro
2021-05-16 11:03:46 +08:00
@des #16
JIT 对于纯 CPU 的运算提升还是很大的,但对于做 Server 这种大多在做 I/O 的提升就不大,影响 Server 性能的最大因素还是并发模型。而 PHP 的主要用途基本还是在做 Server 吧,所以可以理解成 JIT 对于 PHP 的主要用途提升不大。
yekern
2021-05-16 12:12:44 +08:00
两种权重比法啊
一种原生语言没有经过任何三方优化的编译器 jit 等等
一种加持各种优化 例如 PHP 早期的 hhvm 和 现在的 swoole 等等 python 的 pypy 等等
这就是一种参考,就像有人说过这么一句话 任何一门语言写的项目很少能达到语言本身的瓶颈
lovestudykid
2021-05-16 12:14:11 +08:00
接近底层的编译型语言,应该不会差出好几倍。如果差得多了,多半是程序写得实际不一样。
Building
2021-05-16 12:28:25 +08:00
Objective-C 不配拥有名字吗?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/777179

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX