閑來無事,我對java、c、python、go的運算速度做了對比,執(zhí)行的基準代碼是:
python版本
NUM = 111181111 # 這是素數(shù), 因此在循環(huán)結束前不會退出
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命令,時間統(tǒng)一用total統(tǒng)計,比如統(tǒng)計go語言執(zhí)行時間的命令如下:
? Desktop time ./speed
./speed 1.01s user 0.02s system 97% cpu 1.048 total
統(tǒng)計java如下:
? src git:(master) ? time java eg.Speed
java eg.Speed 1.14s user 0.05s system 95% cpu 1.256 total
最終結果統(tǒng)計如下:
| 語言 | 執(zhí)行時間(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 優(yōu)化編譯: gcc -O3 prime.c后 | 0.005 |
| go 1.8.1 | 1.048 |
結論
優(yōu)化編譯的c超級快, go和普通編譯的c其次,java再略慢,python2與python3速度差不多,但比前面三種語言慢10倍。原因我也查了一下, 簡單來說是因為2點:1. Python等動態(tài)類型語言,在執(zhí)行每一個簡單的操作時都需要大量的指令才能完成(包括做類型判斷,不同類型找出各自的方法,執(zhí)行不同的指令); 2. C語言和Python的數(shù)據(jù)結構和算法不同.
另:聽青南安利說用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)
}