얼마나 빨리 갈 수 있습니까? 같습니다 ( Programming Language Shootout 참조

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

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



답변

언어 디자인 측면에서 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와 거의 일치해야합니다.


답변

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

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


답변

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

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

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


답변

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는 단순히 코드를 조정할 수있는 더 많은 기회를 제공한다고 말합니다.

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


답변