闲来无事,我对java、c、python、go的运算速度做了对比,执行的基准代码是:
python版本
NUM = 111181111 # 这是素数, 因此在循环结束前不会退出
def is_prime(n):
i = 2
while i < n:
if n % i == 0:
return False
i += 1
return True
if __name__ == '__main__':
is_prime(NUM)
测试的方式是使用linux的time命令,时间统一用total统计,比如统计go语言执行时间的命令如下:
➜ Desktop time ./speed
./speed 1.01s user 0.02s system 97% cpu 1.048 total
统计java如下:
➜ src git:(master) ✗ time java eg.Speed
java eg.Speed 1.14s user 0.05s system 95% cpu 1.256 total
最终结果统计如下:
语言 | 执行时间(total)秒 |
---|---|
python 2.7.13 | 11.256 |
python 3.7.0 | 11.462 |
java 1.8.0_121 HotSpot | 1.256 |
c (Apple LLVM version 10.0.0): gcc prime.c后 | 1.069 |
c 优化编译: gcc -O3 prime.c后 | 0.005 |
go 1.8.1 | 1.048 |
结论
优化编译的c超级快, go和普通编译的c其次,java再略慢,python2与python3速度差不多,但比前面三种语言慢10倍。原因我也查了一下, 简单来说是因为2点:1. Python等动态类型语言,在执行每一个简单的操作时都需要大量的指令才能完成(包括做类型判断,不同类型找出各自的方法,执行不同的指令); 2. C语言和Python的数据结构和算法不同.
另:听青南安利说用rust可能更快,鉴于没写过rust,因此就不实验了。
其他几个代码的版本如下:
java版本
package eg;
public class Speed {
static final long NUM = 111181111L;
public boolean isPrime(long n) {
long i = 2L;
while (i < n) {
if (n % i == 0) {
return false;
}
i += 1;
}
return true;
}
public static void main(String[] args) {
Speed s = new Speed();
s.isPrime(NUM);
}
}
c版本
int is_prime(long n) {
long i = 2L;
while (i < n) {
if (n % i == 0) {
return 0;
}
i += 1;
}
return 1;
}
int main() {
const long NUM = 111181111L;
is_prime(NUM);
}
go版本
package main
func is_prime(n int) bool {
/* 声明局部变量 */
var i = 2
for i < n {
if n % i == 0 {
return false
}
i++
}
return true
}
func main() {
const NUM int = 111181111
is_prime(NUM)
}