最近看到一个有趣的编程语言研究,它把27种编程语言放到一起做了一个基准测试。
一般的基准测试无非是看看哪个编程语言最快,而这个研究还要看看谁消耗的能量最高。
其中的一个结果让人震惊,Python竟然比C慢71倍,消耗的能量居然是C的75倍!不得不说还是C语言牛逼!!!
这个研究是葡萄牙的一个研究所做的,他们用了一个叫做“The Computer Language Benchmarks Game”测试集。
这个测试集很有趣,既包括程序员熟悉的“二叉树遍历”,也包括“N体问题”这样的天体运动模拟,目的是尽可能多地覆盖到更多领域。
对于程序的运行时间很好计算,记录下开始时间和结束时间,相减就出来了。
对于程序的能耗,他们使用了Intel的RAPL(Running Average Power Limit),这是一种硬件功能,可以监控CPU、内存、GPU能耗,然后通过API来访问。
整体的程序框架大概是这样:
for (i = 0 ; i < N ; i++){
time_before = getTime (...);
rapl_before (...);
// 使用system系统调用来执行程序
// 例如system("/usr/bin/python binarytrees.py")
system(command);
rapl_after (...);
time_elapsed = getTime (...) - time_before ;
...
}
最终的结果是这样的(经过了标准化的处理):
在速度上,不出意料,C语言最快,以它为基准,Python是71.90,Lua最慢。
在能量消耗上,C语言最低,以它为基准,Python是75.88,Perl最差。
在内存占用上,Pascal这门语言竟然排到了第一,C语言屈居第三。
从运行速度,能量消耗、内存使用这三项指标上都能看出C语言的王者之气。
运行速度最快的编程语言:C、Rust、C++、Ada、Java,在节能榜也名列前茅。
可以看出编译型的语言性能确实厉害,Java的虚拟机被优化得也非常强悍。
而解释型语言PHP、Lua、Ruby、Python、Perl等就排名靠后了。
让人吃惊的是Lisp,执行速度靠前,消耗能量之少也名列前茅。
那么,这个结果的可信度如何呢?
The Computer Language Benchmarks Game测试集合有个特点:充分利用了编程语言的特性,致力于让程序运行得最快。
这在真正的实践中是不现实的,因为大部分程序员都不会这么写代码的。
所以研究团队找了一个叫Rosetta Code的测试集合,再次对结果进行验证。
Rosetta Code的特点是是对同一个编程任务,有几百种编程语言的实现!
由于它的目标不是优化程序,而是为了展示不同编程语言的相似之处和不同之处,让学习者能快速地学习另外一种编程语言。
他们从中选了9个任务的代码,再次进行了测试。
结果和之前差不多,C、Pascal、Ada、Rust、C++ 依然排在前面几位,Ruby、Perl、Python依然排在最后。
唯一的例外是Java,排名大幅下降,因为在Rosetta Code的实现中,大量使用了Java集合(如List和Set),而不是静态的数组,从而拖累了Java的性能。
总结
看完这个研究,你有什么感想?
我想说,如果你是一个环保主义者,觉得应该对气候变暖负责任,根据这个研究结果,那你一定得选择C语言来编程!
但是呢,这个研究只关注编程语言在运行时的表现,它不考虑软件的编写成本、维护成本。
C语言和硬件密切相关,是个“低级”的高级语言,想写出好代码不容易。
想用它写出和Java、Python同样功能的程序,花费的时间要长得多,电脑开机的时间也要长得多,这么算下来,用C语言消耗的能量可能远远超过Java和Python。
对于系统级的软件和对性能要求高的软件,C、C++、Rust是不二之选,对于应用层的软件,需要快速实现多变的业务逻辑,还是选择Python、Java、JS、Ruby等编程语言吧,适合的才是最好的!