golang은 정말 빠른걸까?

in #go6 years ago

golang은 컴파일 되어 바이너리 형태로 실행되기 때문에 java처럼 가상머신에서 동작하는 언어보다 당연히 빠를꺼라고 생각을 했다.

그런데 얼마전 stackoverflow에 java와 golang을 비교 했는데, golang이 느리다는 것이다.

https://stackoverflow.com/questions/55263220/why-is-my-go-array-sorting-code-much-slower-than-java?fbclid=IwAR36BAYDzjwIRz9huWINmufbTeXZKFlz3OQKNXDAbsoscgQbGzATU5ckwC0

테스트는 이렇다. 임의로 큰 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라고 느리다는 편견는 갖지 말아야 겠다.