是什么原因导致c/perl/python中简单程序之间的执行时间过长



我用C、Perl和Python编写了一个简单的程序,使变量递增,直到达到10亿。我没想到不同的语言之间会有太大的差异,但我非常惊讶地看到了巨大的差异。这些程序的数量仅为10亿:

在c:

int main() {
int c = 0;
while (c < 1000000000) {
c++;
}
}

在Perl中:

#! /usr/bin/env perl
use strict;
use warnings;
my $x = 0;
while ($x < 1000000000) {
$x++;
}

在Python中:

#!/usr/bin/env python
i = 0
while i < 1000000000:
i += 1

使用zsh/bash时间函数的运行时间为:

对于c:1.78s用户0.01s系统98%cpu 1.813总

对于perl:29.86s用户0.13s系统99%cpu 30.205总

对于Python:71.96s用户0.32s系统98%cpu 1:13.16总

我很难相信c比perl快15倍,比Python快35倍。对于这样一个简单的程序来说,这似乎很疯狂?为什么差异很大?

由于perl变量是非类型化的(事实上,在执行过程中可以更改其有效类型(,因此对它们的每个操作(如<和++(都必须检查:这是一个绑定变量吗;这是一个过载值吗;这是一个整数吗;或浮子;或者字符串:如果是,它是否有有效的数字解释;或者它是不败的?Etc等。对于诸如<,该逻辑适用于两个参数,并且参数的类型可能不同。所以perl必须处理添加到浮点等中的int。

此外,perl并没有将算术运算的结果限制为int。相反,它动态更新变量的类型,例如从有符号int到无符号int再到double,以最好地保持结果的值和准确性。

这意味着perl必须为例如一个简单的加法做大量的工作:与C相比,编译器知道两个参数都是有符号整数,并且不关心结果是否溢出;并且可以将添加映射到单个CPU添加指令

最新更新