얼마나 빨리 갈 수 있습니까?


39

Go는 '금속에 가깝게'실행해야하는 몇 가지 언어 중 하나입니다. 즉 VM없이 컴파일되고 정적으로 유형이 지정되고 코드가 기본적으로 실행됩니다. 이는 Java, C # 등에 비해 속도 이점이 있습니다. 그러나 Java 뒤에있는 것 같습니다 ( Programming Language Shootout 참조 )

덜 성숙한 컴파일러가 이것에 대해 큰 책임을지고 있다고 가정하지만 다른 이유가 있습니까? Go의 디자인에 Java보다 빠른 실행을 방해하는 고유 한 것이 있습니까? 나는 매우 정교하지 않은 런타임 모델을 가지고 있지만 기본적으로 코드 실행 덕분에 적어도 원칙적으로 Java보다 빠르게 실행될 수 있어야합니다.


3
충분히 똑똑한 컴파일러 (및 / 또는 VM 및 / 또는 JIT 컴파일러)가 주어지면 주어진 언어가 항상 더 빨라질 수 있습니다 (물리적 한계가 있지만 그게 전부입니다). 물론이 트루 미즘은이 똑똑한 컴파일러가없는 한 누구에게도 도움이되지 않습니다. Java는 이미 충분히 현명한 구현을 가지고 있으며 매우 똑똑합니다. 인생의 또 다른 사실은 코드 실행이 구현만큼 런타임 성능에 최소한 영향을 미친다는 것입니다.

1
나는 그것을 이해하지만 컴파일러가 성숙함에 따라 Go의 속도가 Java와 일치 / 추월하는 것을 기대하는 것이 합리적인지 궁금합니다.
Greg Slodkowicz 2016 년

17
프로그래밍 언어는 속도가 없습니다. 언어 구현도 마찬가지입니다. 주어진 언어 구현은 주어진 입력에 대한 속도를 가지며,이 속도는 입력에 따라 매우 크게 달라질 수 있습니다.

8
날 깨워 .. 가기 전에 ... 흠! . 죄송합니다. 저항 할 수 없었습니다. 여기에 깃발이 온다. 여기 에 깃발이 온다 .
Tim Post

2
@delnan-또는 "Java (TM) SE 런타임 환경 (빌드 1.6.0_25-b06) 말하는 것보다"Java "를 말하는 것이 훨씬 더 쉬운가? Java HotSpot ™ 64 비트 서버 VM (빌드 20.0-b11) , 혼합 모드) ":-)
igouy

답변:


46

언어 디자인 측면에서 Go를 일반적으로 Java보다 느리게 만드는 것은 없습니다. 실제로 데이터 구조의 메모리 레이아웃을보다 강력하게 제어 할 수 있으므로 많은 일반적인 작업의 경우 다소 빠릅니다. 그러나 현재 기본 Go 컴파일러, 스케줄러, 가비지 수집기, 정규식 라이브러리 및 기타 많은 것들이 특별히 최적화되지 않았습니다. 이것은 꾸준히 개선되고 있지만, 마이크로 벤치 마크에서 우승하는 것보다 유용하고, 단순하며, 빠르다는 데 초점이 맞춰져 있습니다.

연결된 벤치 마크에서 Go는 이진 트리 및 정규식 테스트에서 Java를 크게 잃습니다. 그것들은 각각 메모리 관리 시스템과 regexp 라이브러리의 테스트입니다. Go의 메모리 관리는 더 빨라질 수 있으며 시간이 지남에 따라 확실히 개선 될 것입니다. 현재 표준 정규 표현식 라이브러리는 곧 더 나은 구현을위한 자리 표시 자입니다. 따라서이 두 가지를 잃는 것은 놀라운 일이 아니며 가까운 시일 내에 마진이 더 좁아 져야합니다.

k- 뉴클레오티드 벤치 마크의 경우 Java 코드가 다른 알고리즘을 사용하고 있기 때문에 비교하기가 다소 어렵습니다. Go 코드는 확실히 작성된대로 컴파일러, 스케줄러 및 할당 자 개선 기능을 통해 이점을 얻을 수 있지만 더 정확하게 비교하려면 누군가가 Go 코드를 다시 작성하여 더 영리한 작업을 수행해야합니다.

Java는 부동 소수점 산술 및 루프이기 때문에 mandelbrot 벤치 마크에서 승리합니다. 이는 JVM이 런타임에 정말 좋은 기계 코드를 생성하고 물건을 호이스트하기에 좋은 장소입니다. Go는 비교할 때 현재 매우 인상적인 머신 코드를 끌어 올리거나 풀거나 생성하지 않는 매우 간단한 컴파일러를 가지고 있으므로 잃어버린 것은 놀라운 일이 아닙니다. 그러나 Java 타이밍은 JVM 시작 시간을 계산하지 않거나 JVM이 JIT를 멋지게 JIT하기 위해 실행해야하는 횟수를 계산해야합니다. 장기 실행 프로그램의 경우에는 관련이 없지만 경우에 따라 중요합니다.

나머지 벤치 마크와 관련하여 Java와 Go는 기본적으로 넥-인-넥 (neck-in-neck)이며, Go는 메모리와 코드를 줄입니다. 따라서 많은 테스트에서 Go가 Java보다 느리지 만 Java는 매우 빠르며 Go는 비교에서 꽤 잘 수행되며 가까운 시일 내에 Go가 현저히 빨라질 것입니다.

gccgo (gcc codegen을 사용하는 Go 컴파일러)가 성숙 할 때 기대하고 있습니다. 많은 유형의 코드에 대해 C와 거의 일치해야합니다.


2
소스 코드를보고 수행중인 작업을 항상 확인해야한다는 점을 이해하기 위해 잘 수행했습니다.
igouy

1
이러한 프로그램에 대한 자바 시작 시간에 볼 shootout.alioth.debian.org/help.php#java
igouy

2
그건 바로 내가 감사를 기대했다 대답의 종류!
Greg Slodkowicz

코드 및 메모리 사용량이 훨씬 적고 기계 코드로 컴파일되며 더 잘 설계되었습니다. 이 모든 것이 속도 단점을 극복합니다.
모쉐 Revah

22
  1. 어떤 문제가 해결되었는지는 말할 필요없이 전체 벤치 마크는 의미가 없습니다.
  2. JVM과 CLR은 모두 JIT를 사용하여 기계 코드를 생성합니다. 이것이 느려질 이유가 없습니다. 부팅하는 데 시간이 오래 걸립니다.
  3. Go는 빠르게 구축 되도록 설계되었습니다 . 많은 컴파일 시간과 부팅 시간 최적화가 없습니다. Go는 Java 앱이 부팅 될 때 자체 표준 라이브러리를 컴파일합니다.

런타임에 더 빠를 수 있습니까? 예. 런타임에 Go가 더 빨라질까요? 모르겠어요 아마도 컴파일러 빌더는 컴파일 시간에 옵션 최적화를 추가 할 것입니다. 그러나 나는 그들이 그것에 관심이 있다고 생각하지 않습니다. 그들은 Google에서 일합니다.
그들이 원하는 것은 빠른 개발을 가능하게하고 그들이하는 일을 잘 수행하는 언어입니다. 지옥은 벤치 마크가 신뢰할 만하더라도 C보다 절반, 파이썬보다 14 배 빠릅니다. 이것으로 충분합니다.
하드웨어는 싸고 코드는 비싸다. 돈을 투자할수록 코드가 커지고 느려지는 경향이 있고 하드웨어는 더 싸고 작아집니다. 유용한 것을 달성하기 위해 4 개의 프레임 워크와 2000 개의 클래스가 필요없는 언어를 원합니다.
Go의 디자인에는 고유 한 것이 없기 때문에 속도가 느려집니다. 그러나 Go 디자이너에게는 고유 한 것이있어 조립보다 느리게합니다. 상식.


1
코드가 처음로드 될 때가 아니라 런타임 동안 대부분의 JIT가 컴파일됩니다. 이 머신 코드는 일부 코드에 대해 전혀 생성되지 않을 수 있으며, 예를 들어 objsin for (obj : objs) { obj.meth() }meth매번 다른 구현을 가지고 있고 JIT가 인라인을 시도하는 경우 쉽게 무효화 될 수 있습니다 . 물론,이 모든 것은 실제로 일반적인 경우에 이점 이지만 여전히 주목할 만합니다.

@delnan : V8 은 코드를 실행하기 전에 모든 코드를 JIT합니다. 또한 LLVM은 JITting을 염두에두고 작성되었으므로 (물론 약간의 노력으로) 컴파일 타임에 발생하는 모든 적시에 최적화를 수행 할 수 있습니다. 그러나 이스케이프 분석과 같은 특정 최적화는 실제로 JIT에서만 작동합니다.
back2dos

3
>> 어떤 문제가 해결되었다고 말하지 않고 << 그러면 웹 페이지에서 어떤 문제가 해결되었는지 알 수 있습니다. 실제로, 당신은 프로그램 소스 코드, 빌드 명령, 실행 명령, 언어 구현 버전, ya da ya da ya
igouy를 찾을 수 있습니다

10

또한 Go가 특히 regex-dna 벤치 마크 에서 느리다 는 것을 알았습니다 . Russ Cox는 왜 Go가이 특정 벤치 마크에서 그렇게 성능이 좋지 않은지 설명했습니다 . 그 이유는 Go의 정규 표현식 패키지 가이 특정 벤치 마크에서는 성능이 좋지 않지만 다른 벤치 마크에서는 훨씬 빠른 다른 매칭 알고리즘 을 사용하기 때문 입니다. 또한 Ruby, Python 및 기타 스크립팅 언어는 다른 정규식 일치 알고리즘C 구현을 사용하고 있습니다.

마지막으로 컴퓨터 언어 벤치 마크 게임 은 측정 된 언어의 많은 특성을 정확하게 반영하지 못하고 잘못된 인상을 중재 할 수있는 마이크로 벤치 마크로 구성됩니다. 이 최근 구글에 의해 게시 된 연구 논문은, 이동, 스칼라, 자바와 C ++의 여러 언어 특성의 정확한 개요를 제공합니다 , 특히 "V. 성능 분석"부분을 -. 결국 Go는 거의 Java만큼 메모리가 부족하고 (Java 메모리의 81 %) Scala보다 170 % 나 많은 메모리를 소비합니다 (본 논문에서는 JVM의 메모리 소비가 고려되었는지 여부를 알 수 없음).

그러나 Go는 아직 젊지 만 여전히 많은 개발을하고 있습니다 (API 변경)! 많은 개선이 곧 이루어질 것입니다.


3
>>이 연구 논문은 최근 Google이 발행 한 << 연구 논문이 아니며 Google이 발행 한 것이 아닙니다. "Scala Days 2011"Scala 워크숍에서 발표 된 한 Google 직원의 경험 보고서입니다.
igouy

>> 측정 된 언어의 많은 특성을 정확하게 반영하지 못하고 심지어 잘못된 인상을 중재 할 수도 있습니다 << 이것은 "루프 인식"프로그램의 경우와 동일하며 다른 프로그래밍 언어 간의 모든 성능 비교에서도 마찬가지입니다. 실제로 저자는 "우리는 멀티 스레딩 또는 더 높은 수준의 유형 메커니즘의 어떤 측면도 탐구하지 않습니다 ... 우리는 또한 무거운 수치 계산을 수행하지 않습니다 ..."
igouy

@igouy 표지에서 "Google"을 읽을 수 있으며 관련된 모든 내용은 해당 참조로 덮여 있습니다. 그렇다면 본사 주소로 Google을 언급 한 경우 왜 "Google이 발행 한 연구 논문"이 아닌가? 연구 논문은 학계 전용 도메인이 아닙니다.
Alex

표지에는 저자에게 연락 할 수있는 우편 주소와 저자의 이메일 주소가 나와 있습니다. 게시 한 pdf의 URL을 확인하십시오. 도메인-days2011.scala-lang.org-스칼라 데이 2011 "스칼라 워크숍
igouy

1

Go는 Python보다 빠르며 Java보다 조금 느립니다. 나의 거친 경험에 따르면 Go는 Python보다 훨씬 빠르며 Java보다 약 10-20 % 느립니다. 그러나 쿼드 코어 (x64)와 함께 사용하면 Go가 Java보다 약간 빠릅니다. 또한 메모리 RAM 측면에서 훨씬 더 효율적입니다.

Java와 Python에 비해 성능에 대한 Go의 잠재력에 대한 몇 가지 요점을 추가하고 싶습니다. Go는 C가하는 대부분의 작업을 통해 C가 다른 대부분의 언어를 지속적으로 능가합니다. 캐시 누락은 고성능 코드를 피하기 위해 매우 중요합니다. 캐시 미스를 줄이려면 데이터 구조의 메모리 레이아웃을 제어해야합니다. Go를 사용하면 그렇게 할 수 있습니다. Java는 메모리와 캐시의 손상을 피하기 어렵게 만듭니다.

Java 가비지 수집기는 훨씬 더 정교하기 때문에 현재 Java는 일반적으로 Go보다 빠르게 실행됩니다. Go 가비지 수집기가 더 나을 수는 없었습니다. 현재 코드 생성은 Java의 경우 훨씬 나을 것입니다. Go는 벡터 명령 등을 지원하여 개선 할 수있는 많은 잠재력을 가지고 있습니다.

Go가 Java를 넘어 서기 전에 시간 문제라고 생각합니다. 다른 언어 코드와 마찬가지로 Go로 작성되어 자동으로 더 빨라지는 것은 아닙니다. 언어가 제공하는 기능을 활용해야합니다. Go는 단순히 코드를 조정할 수있는 더 많은 기회를 제공한다고 말합니다.

어쨌든, 그것은 단지 하나의 개발자 경험입니다.


4
이것은 8 살짜리 질문이며 저렴한 컴퓨팅 성능으로 인해 거의 관련이 없습니다. 귀하의 답변은 또한 하드 데이터가 아닌 "자신의 감정"에 기초합니다. 당신을 낙담시키는 것은 아니지만…
카야 만
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.