golang은 컴파일 되어 바이너리 형태로 실행되기 때문에 java처럼 가상머신에서 동작하는 언어보다 당연히 빠를꺼라고 생각을 했다.
그런데 얼마전 stackoverflow에 java와 golang을 비교 했는데, golang이 느리다는 것이다.
테스트는 이렇다. 임의로 큰 float64 타입의 배열을 생성 후에, 랜덤값을 배열을 모두 채운다.
그리고 생성한 배열을 API에서 제공하는 정렬 기능으로 배열을 정렬하고 시간을 비교하는 것이다.
golang
package main
import (
"fmt"
"math/rand"
"sort"
"time"
)
func main() {
fmt.Println("Starting")
const x = 1000000
const y = x * 10
var s [y]float64
s1 := rand.NewSource(time.Now().UnixNano())
r1 := rand.New(s1)
start1 := time.Now()
for i := 0; i < y; i++ {
s[i] = r1.Float64()
}
end1 := time.Since(start1)
ss := s[:]
start2 := time.Now()
sort.Float64s(ss)
end2 := time.Since(start2)
fmt.Println(end1)
fmt.Println(end2)
fmt.Println("Number: ", ss[x])
}
java
import java.util.*;
class RSTest {
public static void main(String[] args) {
System.out.println("Starting");
int x = 1000000;
int y = x * 10;
Random gen = new Random(System.currentTimeMillis());
double[] s = new double[y];
long start1 = System.nanoTime();
for (int i = 0; i < y; i++) {
s[i] = gen.nextDouble();
}
long end1 = System.nanoTime();
long start2 = System.nanoTime();
Arrays.sort(s);
long end2 = System.nanoTime();
System.out.println((end1 - start1) / (1000000000.0));
System.out.println((end2 - start2) / (1000000000.0));
System.out.println(s[x]);
}
}
테스트 결과는 java가 매우 빠르다이다.
java
0.3590694
1.6030528
0.10000905418967532
go
233.1957ms
5.4633992s
Number: 0.10002801819954663
단순 비교를 통해 언어의 우위는 의미가 없다고 생각한다. 다만 가상머신에서 동작하는 java라고 느리다는 편견는 갖지 말아야 겠다.