본문 바로가기

컴퓨터 기술

제일 짧게 프로그래밍할 수 있는 언어는 무엇일까?

반응형

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

이 사이트는 언어 벤치마킹 사이트 중 제일 유명한 곳이고 내용은 각종 알고리듬을 언어별로 짜서 비교하는 겁니다.

언어 벤치마킹 x86 싱글코어 버전입니다.

http://shootout.alioth.debian.org/u32/which-language-is-best.php?calc=ca...

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

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

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

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

http://shootout.alioth.debian.org/u32q/which-language-is-best.php?calc=c...

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

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로 정규화된다는 뜻인가요??

무슨 뜻이죠?

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

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

1,0,0을 입력하면 속도 비교가 됩니다.
http://shootout.alioth.debian.org/u32/which-language-is-best.php?calc=ca...

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

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

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

1,0,1을 입력하면 속도와 분량을 같이 가중치두는 것입니다.
http://shootout.alioth.debian.org/u32/which-language-is-best.php?calc=ca...

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

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

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


추가:
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

반응형