go python c node.js javaのパフォーマンス
goを使用するメリットとして一番最初に思いつくのはパフォーマンスです。そこで、簡単なプログラムで比較してみました。(プログラム自体は適当です)
Go言語 golang:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
package main import "fmt" func main() { fmt.Println("Start") var v, c = sqrt(2) fmt.Println("val:", v, " cnt:", c) } func sqrt(x float64) (float64, int64) { var value float64 = 1.0 var roopCount int64 = 0 for true { roopCount++ var chk = value * value if abs(chk-x) < 0.00000001 { break } if chk < x { value += 0.0000000001 } else { value -= 0.0000000001 } } return value, roopCount } func abs(x float64) float64 { if x < 0 { return -x } return x } |
結果:
>powershell -C (Measure-Command {.\hello.exe}).TotalSeconds
11.6578298
C言語 (MinGW gcc -O3):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
#include <stdio.h> double mysqrt(double x, long long int * c); double myabs(double x); void main(void) { printf("Start\n"); double v; long long int c; v = mysqrt(2, &c); printf("val:%lf cnt:%lld\n", v, c); } double mysqrt(double x, long long int * c) { double value = 1.0; long long int roopCount = 0; while (1) { roopCount++; double chk = value * value; if (myabs(chk-x) < 0.00000001) { break; } if (chk < x) { value += 0.0000000001; } else { value -= 0.0000000001; } } *c = roopCount; return value; } double myabs(double x) { if (x < 0) { return -x; } return x; } |
結果:
>powershell -C (Measure-Command {.\a.exe}).TotalSeconds
19.1138693
Node.js:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
function main() { console.log("Start") ret = mysqrt(2) v = ret[0] c = ret[1] console.log("val:" + v + " cnt:" + c); } function mysqrt(x) { var value = 1.0 var roopCount = 0 while(true) { roopCount++ var chk = value * value if (myabs(chk-x) < 0.00000001) { break } if (chk < x) { value += 0.0000000001 } else { value -= 0.0000000001 } } return [value, roopCount] } function myabs(x) { if (x < 0) { return -x } return x } main() |
>powershell -C (Measure-Command {node hello.js}).TotalSeconds
33.696455
Python:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
def main(): print("Start\n") v, c = mysqrt(2) print(r"val:{v} cnt:{c}\n") def mysqrt(x): value = 1.0 roopCount = 0 while True: roopCount += 1 chk = value * value if myabs(chk-x) < 0.00000001: break if chk < x: value += 0.0000000001 else: value -= 0.0000000001 return [value, roopCount] def myabs(x): if x < 0: return -x return x main() |
Java:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
class hello { public static void main(String args[]) { System.out.println("Start"); double v; long c; Object[] ret = mysqrt(2); v = (Double)ret[0]; c = (Long)ret[1]; System.out.println("val:" + v + " cnt:" + c + "\n"); } static Object[] mysqrt(double x) { double value = 1.0; long roopCount = 0; while (true) { roopCount++; double chk = value * value; if (myabs(chk-x) < 0.00000001) { break; } if (chk < x) { value += 0.0000000001; } else { value -= 0.0000000001; } } Object [] rets = new Object[2]; rets[0] = new Double(value); rets[1] = new Long(roopCount); return rets; } static double myabs(double x) { if (x < 0) { return -x; } return x; } } |
>powershell -C (Measure-Command {java hello}).TotalSeconds
11.2736181
結論
一応、この計測ではjavaとgoがほぼ互角となりました。やはり、Javaは早いみたいですね。Goも早いですね。
(ただ、Javaはループは早くても少し大きなプログラムだと、起動時間が遅くメモリの使用量が凄いのは、みなさん体感している通りだとは思いますが)
Node.jsも内部ではネイティブにコンパイルされているとは言いますが、java/go/cにはかなわないみたいです。これは言語仕様の問題だと思われます。なお、pythonは本当に遅いです。
1位 Java: 11秒
2位 go: 11秒
3位 c (gcc -O3): 19秒
4位 Node.js: 33秒
5位 Python: 計測不能(数時間待っても終らないので終了)
今後は、速度を求めるのであれば、goかKotlin (java VM上で動作する)が良さげかなというのが個人的な結論ですね。
コメントを残す