본문 바로가기

컴퓨터 기술

프로그래밍 언어 벤치마크 게임

반응형

프로그래밍 언어 벤치마킹 사이트입니다.
http://shootout.alioth.debian.org/

x86 1코어 속도, 메모리, 용량순
x64 4코어 속도, 메모리, 용량순
x86 4코어 속도, 메모리, 용량순
x64 1코어 속도, 메모리, 용량순

계속 루비가 1위를 하다가 최근에 파이썬으로 바뀌었습니다.

자바스크립트나 펄도 루비, 파이썬정도 분량입니다.

특히, 타입 선언이 없는 언어들이 분량이 적은 것 같습니다.

쿼드코어판에서는 파이썬3가 제일 짧다고 나옵니다.

Time secs는 수행 시간, Memory KB는 사용 메모리, Code B는 gzip으로 압축한 용량을 나타냅니다.

0,0,1을 입력하면 프로그램 분량을 벤치마킹할 수 있습니다.

전반적으로 파이썬, 루비, 자바스크립트, 펄, 루아, PHP가 분량이 적다고 나옵니다.

1,0,0을 입력하면 속도 비교가 됩니다.

C++, C, Java 6 Server, Scala, Ocaml, Free Pascal이 빠르다고 합니다.

Mono C#이 자바 Server보다 느리고, 파이썬보다 캐시 없는 PHP가 두배 이상 느립니다.

Java 6 Server와 Scala는 속도가 비슷합니다.


1,0,1을 입력하면 속도와 분량을 같이 가중치두는 것입니다.

이 순위는 C, C++, LuaJIT, Scala, Ocaml, Java 6 Server, Free Pascal, Haskell, Clean이 상위입니다.

Scala나 Ocaml같은 함수형 언어가 분량도 적고 속도도 씨정도로 빠르다니 매력적이네요.

GM이란 말이 이해가 안 갑니다.
http://en.wikipedia.org/wiki/Weighted_geometric_mean

For each benchmark, B is the best measurement; for each language implementation, the best measurement L is then normalized to L/B. GM is the Weighted Geometric Mean of those L/B ratios.

B가 수행 시도중 최대값이고 L은 언어 중 최대값인데 L/B로 정규화된다는 뜻인가요??

무슨 뜻이죠?

Which programming language is best? The Weighted Geometric Mean
Read "How not to lie with statistics: the correct way to summarize benchmark results" (pdf).

For each benchmark, B is the best measurement; for each language implementation, the best measurement L is then normalized to L/B

GM is the Weighted Geometric Mean of those L/B ratios.

missing : Language implementations with more than a couple of Timeouts (at the largest workload) distort the ranking - so they have been excluded. They can still be compared directly against another language implementation.


다른 결과 지문과 표를 잘 읽어보니까 each benchmarks는 각각의 알고리듬을 얘기하는 겁니다.

each language implementations는 각각의 다른 종류의 언어를 뜻합니다.

언어1(c++) x1.0, GM1.14: 알고리듬a(regex-dna) a1초, 알고리듬b(reverse-complement) b2초, 알고리듬c(n-body) c3초
언어2(c) x1.2, GM1.42: 알고리듬a a2초, 알고리듬b b2초, 알고리듬c c2초
언어3(java) x1.7, GM1.93:  알고리듬a a3초, 알고리듬b b3초, 알고리듬c c3초

이렇게 되어 있을 때 GM이 어떻게 나온 건지 아시는 분 계신가요?

c++가 1이라고 할 때 c가 1.2배인 것은 이해가 가는데 GM이 1.14인 것은 구체적으로 어떻게 나온 건지 모르겠습니다.

스프레드시트로 계산을 해봤습니다.

L/B를 일단 구해야 되는데요, L은 알고리듬a 결과가 제일 빠르게 나온 언어x의 값을 얘기하는 것 같습니다.

B는 구하고싶은 언어1의 알고리듬a 결과입니다.

즉 어떤 언어의 알고리듬a 결과를 제일 빨리 나온 언어x값으로 나눈다는 뜻입니다.

나온 알고리듬a부터 알고리듬c까지를 전부 곱해서 3제곱근을 구하면 기하평균이 GM보다 약간 큰 값이 나왔습니다.

가중치를 어떻게 곱하는 건지 모르겠습니다.

가중치를 곱할 때 어떤 걸 가중치로 썼다는 걸까요?

알고리듬 중요성별로 가중치를 두었다는 뜻 같은데요.

그러니까 정리하면 GM이란 정확히말해 가중기하평균을 얘기하는 거고 그건 어떤 알고리듬들을 제일 빨리 수행한 언어들 대비 몇 배 느린가를 평균낸 겁니다. 만약 각 알고리듬을 모두 제일 빨리 수행하는 가상의 언어가 있다면 그것에 비해 몇 배 느린가를 뜻하는 거죠.

X는 GM이 제일 빠른 언어가 있을 때 다른 언어들의 비율입니다.

관련 소스는 여기에 있습니다. 템플릿이 사용되어 구조가 이해가 안가네요.
https://alioth.debian.org/scm/viewvc.php/shootout/website/lib/?root=shootout

실제 프로그래밍에 걸린 시간을 측정하는 벤치마킹도 나왔으면 좋겠습니다.

반응형