Javascript V8 속도를 얻기 위해 Ruby, Python을 차단하는 것은 무엇입니까? [닫은]


261

V8 엔진 에 최적화 구현 (예 : 인라인 캐싱 )을 차단하는 Ruby / Python 기능 이 있습니까?

Python은 Google 직원이 공동 개발하므로 소프트웨어 특허에 의해 차단되어서는 안됩니다.

또는 이것은 Google이 V8 프로젝트에 넣은 리소스 문제입니다.


6
내부 검사 및 연산자 오버로드는 아마도 큰 것일 수도 있지만 JS를 잘 알지 못해서 실제 답변을 줄 수 있습니다. PyPy 프로젝트는 파이썬이 JS 종류의 속도에 도달 할 수있는 최고의 기회 일 것입니다.
ncoghlan

11
PyPy가 완전한 볼록 인 컴퓨터 언어 총격을 제외하고 V8보다 느린 예가 있습니까 ? 아니면 구글의 현실 왜곡 분야입니까?
fijal

3
V8은 파이썬과 크게 다르지 않습니다. 더 나은 비교를 위해 V8이 1.8 Javascript 스펙을 구현해야 할 때까지 기다리십시오. 그리고 그 시점에서 누군가 Javascript 대신 V8 엔진 위에 PyPy를 구현하려고 시도합니다.
Michael Dillon

14
왜 V8이 Python 또는 Ruby보다 빠르다고 확신합니까? 무엇에?
jcoffland

6
V8은 Python / Ruby보다 절대적으로 빠릅니다. 간단한 마이크로 벤치 마크에서 두 환경 모두에서 관용적으로 작성된 포괄적 인 실제 응용 프로그램에 이르기까지 원하는 모든 종류의 벤치 마크를 수행하십시오. 대부분의 언어 네이티브 작업 (즉, Python에서 C 코드에 위임되지 않은 작업)의 경우 훨씬 빠릅니다.
Hejazzman

답변:


519

Javascript V8 속도를 얻기 위해 Ruby, Python을 차단하는 것은 무엇입니까?

아무것도.

글쎄, 돈 : 돈. (시간, 사람, 자원이지만 돈이 있으면 구입할 수 있습니다.)

V8에는 수십 년의 경험을 가진 (저는 개별적으로 이야기하고 있습니다.) 동적 OO 언어를위한 엔진. 기본적으로 Sun HotSpot JVM을 만든 사람과 동일합니다 (많은 사람들 중에서).

수석 개발자 인 Lars Bak은 문자 그대로 VM에서 25 년 동안 작업 해 왔으며 (이러한 모든 VM은 V8까지 이어졌습니다) 기본적으로 그의 전체 (전문) 수명입니다. Ruby VM을 작성하는 사람들 중 일부는 25 세가되지도 않았습니다.

V8 엔진에 최적화 구현 (예 : 인라인 캐싱)을 차단하는 Ruby / Python 기능이 있습니까?

적어도 IronRuby, JRuby, MagLev, MacRuby 및 Rubinius에는 단형 (IronRuby) 또는 다형 인라인 캐싱이 있으므로 대답은 분명히 아니오입니다.

최신 Ruby 구현은 이미 많은 최적화를 수행합니다. 예를 들어 특정 작업의 경우 Rubinius의 Hash클래스는 YARV보다 빠릅니다. 이제는 Rubinius의 Hash클래스가 100 % 순수 루비로 구현되고 YARV가 100 % 손으로 최적화 된 C로 구현 된다는 사실을 알기 전까지는 그렇게 들리지 않습니다 .

따라서 적어도 일부 경우에 Rubinius는 GCC보다 더 나은 코드를 생성 할 수 있습니다!

또는 이것은 Google이 V8 프로젝트에 넣은 리소스 문제입니다.

예. Google뿐만 아니라 V8 소스 코드의 계보는 25 년이되었습니다. V8을 작업하는 사람들은 Self VM (현재까지 가장 빠른 동적 OO 언어 실행 엔진 중 하나), 애니 모픽 스몰 토크 VM (지금까지 가장 빠른 스몰 토크 실행 엔진 중 하나), HotSpot을 만들었습니다. JVM (가장 빠른 JVM, 아마도 가장 빠른 VM 기간) 및 OOVM (가장 효율적인 Smalltalk VM 중 하나).

실제로 V8의 수석 개발자 인 Lars Bak은 그중 하나 와 몇 가지를 모두 연구했습니다.


1
"적어도 IronRuby, JRuby, MagLev, MacRuby 및 Rubinius에 단형 (IronRuby) 또는 다형성 인라인 캐싱이 있다는 답변을 얻을 수 있습니다." 부디?
WDRust

14
SpiderMonkey는 비슷한 성능을 가지고 있습니다. 그러면 Mozilla는 어떻게 했습니까? 그들은 매우 비용을 제한했습니다 ..
살만 폰 압바스을

8
@ SalmanPK : 첫 번째 VM이 아니며 Mozilla에서 일하는 똑똑한 사람들도 있습니다.
Matthieu M.

3
@SalmanPK, miguel : Mozilla는 리버스 엔지니어링 V8에 의해 적어도 부분적으로 JS VM을 만들었습니다. blog.mozilla.org/dmandelin/2010/09/08/presenting-jagermonkey
Ian

2
@Ian V8은 오픈 소스 (BSD 라이센스)이므로 리버스 엔지니어링 할 필요가 없습니다.
dbkk

78

JavaScript 인터프리터를 고도로 최적화하려는 동기가 훨씬 더 많기 때문에 Mozilla, Google 및 Microsoft간에 많은 리소스가 포함되어 있습니다. 자바 스크립트는 (보통 참을성이없는) 사람이 기다리는 동안 실시간으로 다운로드, 파싱, 컴파일 및 실행해야하며, 사람이 상호 작용하는 동안 실행되어야하며, 통제되지 않은 클라이언트 쪽에서이를 수행해야합니다. 컴퓨터, 전화 또는 토스터 일 수있는 환경. 이러한 조건에서 효과적으로 실행하려면 효율적이어야합니다.

Python과 Ruby는 개발자 / 배포자가 제어하는 ​​환경에서 실행됩니다. 제한적인 요소가 일반적으로 메모리 나 디스크 I / O와 같은 것이며 실행 시간이 아닌 강력한 서버 또는 데스크탑 시스템. 또는 캐싱과 같은 비 엔진 최적화가 활용 될 수 있습니다. 이러한 언어의 경우 속도 최적화보다 언어 및 라이브러리 기능 세트에 초점을 맞추는 것이 더 합리적입니다.

이것의 부수적 인 장점은 Node.js와 같은 모든 애플리케이션에 재사용 할 수있는 두 개의 고성능 오픈 소스 JavaScript 엔진이 있다는 것입니다.


43

그것의 좋은 부분은 커뮤니티와 관련이 있습니다. 파이썬과 루비는 대부분 기업 지원이 없습니다. 파이썬과 루비 풀 타임으로 일하는 사람은 아무도 없습니다 (특히 CPython이나 MRI에서 일하는 동안 항상 돈을받지 않습니다). 반면에 V8은 세계에서 가장 강력한 IT 회사의 지원을받습니다.

또한 V8 사람들에게 중요한 것은 인터프리터이기 때문에 V8이 더 빠를 수 있습니다. 통역 할 표준 라이브러리가없고 언어 디자인에 대한 염려가 없습니다. 그들은 단지 통역사를 작성합니다. 그게 다야.

지적 재산권 법과는 아무런 관련이 없습니다. 구글 직원들도 파이썬을 공동 개발하지도 않는다 (제작자는 다른 커미터들과 함께 일하지만 파이썬에서 돈을 지불하지는 않는다).

파이썬 속도에 대한 또 다른 장애물은 파이썬 3입니다.이 언어의 채택은 언어 개발자의 주요 관심사 인 것 같습니다. 다른 구현을 따라 잡을 때까지 새로운 언어 기능의 개발을 중단했습니다.

기술적 세부 사항에 관해서는 Ruby에 대해 많이 알지 못하지만 Python에는 최적화를 사용할 수있는 여러 곳이 있습니다 (Google 프로젝트 인 Unladen Swallow는 먼지를 물기 전에 구현하기 시작했습니다). 다음은 계획 한 최적화 중 일부입니다 . PyPy의 JIT가 CPython을 위해 구현되면 파이썬이 V8 속도를 얻는 것을 볼 수는 있지만 앞으로 몇 년 동안은 그럴 것 같지 않습니다 (현재 초점은 JIT가 아닌 Python 3 채택입니다).

많은 사람들은 루비와 파이썬이 각각의 전역 인터프리터 잠금 장치 를 제거함으로써 엄청난 이익을 얻을 수 있다고 생각합니다 .

또한 파이썬과 루비는 JS보다 훨씬 무거운 언어라는 것을 이해해야합니다. 표준 라이브러리, 언어 기능 및 구조에 훨씬 더 많은 기능을 제공합니다. 객체 지향의 클래스 시스템만으로도 많은 무게가 추가됩니다 (좋은 방법으로 생각합니다). 나는 거의 자바 스크립트를 Lua와 같이 내장되도록 설계된 언어라고 생각한다 (그리고 여러면에서 비슷하다). 루비와 파이썬은 훨씬 더 풍부한 기능을 가지고 있으며, 그 표현력은 대개 속도를 낼 것입니다.


3
실제로 새로운 기능에 대한 모라토리엄은 최근 Python 3.2 릴리스 이후에 해제되었습니다.
jd.

2
+1이지만 새로운 언어 기능을 사용하지 않으면 최적화에 더 많은 시간을 할애하지 않습니까?
Andrew Grimm

1
@Andrew 만 해당됩니다. Jython, IronPython 및 PyPy의 속도를 높이고 라이브러리가 Python 3으로 변환 될 때까지 기다렸다가 Python 3을 복음화하는 데 중점을 둡니다.
Rafe Kettler

2
"객체 지향의 클래스 시스템만으로도 많은 무게가 추가됩니다."-V8과 같은 최신 JavaScript VM에는 클래스가 있습니다. 단지 암시 적입니다. 파이썬에서와 마찬가지로 JavaScript에서 변수를 명시 적으로 입력 할 필요가없고 클래스를 명시 적으로 입력 할 필요가 없습니다. VM은 코드를 살펴보고 클래스를 추출 할만큼 영리합니다.
Benjamin Gruenbaum

1
내가 이해하는 것처럼 V8은 인터프리터가 아닌 JIT 컴파일러입니다 ... 두 가지 사이에 차이가 있다고 확신합니다. 어쩌면 ... 몰라
Luke

24

성능은 "충분히 빠름"만으로도 충분하다고 생각하는 핵심 Python 개발자의 주요 초점이 아닌 것 같습니다. 프로그래머가 생산성을 높이는 데 도움이되는 기능은 컴퓨터가 코드를 더 빨리 실행하는 데 도움이되는 기능보다 중요합니다.

그러나 표준 인터프리터와 호환되는 더 빠른 Python 인터프리터를 생성하기 위해 unladen-swallow 라는 (현재 버려진) Google 프로젝트가 있었습니다. PyPy 는 더 빠른 Python을 생성하려는 또 다른 프로젝트입니다. PyPy의 선구자 인 Psyco 도 있으며 전체 통역사를 변경하지 않고도 많은 Python 스크립트의 성능을 향상시킬 수 있으며 Cython 은 Python 구문과 매우 유사한 것을 사용하여 Python 용 고성능 C 라이브러리를 작성할 수 있습니다.


13

오해의 소지가있는 질문. V8은 JavaScript의 JIT (Just-In-Time 컴파일러) 구현이며 가장 많이 사용되는 비 브라우저 구현 Node.js에서는 이벤트 루프를 중심으로 구성됩니다. CPython은 JIT가 아니며 이벤트가 아닙니다. 그러나 이들은 PyPy 프로젝트에서 가장 일반적으로 사용됩니다. CPython 2.7 (및 곧 3.0 이상) 호환 JIT입니다. 예를 들어 Tornado와 같은 이벤트 서버 라이브러리가 많이 있습니다. 실제 테스트는 Tornado와 Node.js를 실행하는 PyPy간에 존재하며 성능 차이는 미미합니다.


3
언급 +1 토네이도 . Node.js와 비슷한 속도로 진행되는 동안, gen.engine모듈은 파이썬 생성기 및 yield명령문 과 함께 ( 2.5 !!!부터 비동기 코딩을 재정의 할 수 있습니다.
Lukas Bünger

1
귀하의 게시물 이후, pypy는 안정적인 3.x 지원 버전을 출시했습니다 (물론 지원 개선을 계속합니다) : morepypy.blogspot.fr/2014/06/pypy3-231-fulcrum.html
Zeograd

9

방금이 질문에 부딪 쳤으며 언급되지 않은 성능 차이의 큰 기술적 이유가 있습니다. 파이썬에는 강력한 소프트웨어 확장 기능이있는 매우 큰 에코 시스템이 있지만 이러한 확장 기능의 대부분은 성능을 위해 C 또는 다른 저수준 언어로 작성되며 CPython API와 밀접한 관련이 있습니다.

CPython 구현 속도를 높이는 데 사용할 수있는 잘 알려진 많은 기술 (JIT, 최신 가비지 수집기 등)이 있지만 모두 API의 실질적인 변경이 필요하므로 프로세스의 대부분의 확장이 중단됩니다. CPython은 더 빠를 것이지만, 파이썬 (매우 광범위한 소프트웨어 스택)을 매력적으로 만드는 많은 것들이 손실 될 것입니다. 예를 들어, 몇 가지 더 빠른 Python 구현이 있지만 CPython에 비해 견인력이 거의 없습니다.


9

디자인 우선 순위와 사용 사례 목표가 다르기 때문에 저는 믿습니다.

일반적으로 스크립트 (일명 동적) 언어의 기본 목적은 기본 함수 호출간에 "접착제"가되는 것입니다. 이러한 기본 기능은 a) 가장 중요하고 자주 사용되는 영역을 다루고 b) 가능한 한 효과적이어야합니다.

예제는 다음과 같습니다. iOS Safari가 정지되도록하는 jQuery 정렬 정지는 선택자 별 호출을 과도하게 사용하여 발생합니다. 선택자 별 가져 오기가 기본 코드로 구현되고 효과적으로 그러한 문제는 발생하지 않습니다.

V8 데모에 자주 사용되는 레이트 레이서 데모를 고려하십시오. Python 세계에서는 Python이 기본 확장을위한 모든 기능을 제공하므로 기본 코드로 구현할 수 있습니다. 그러나 V8 영역 (클라이언트 측 샌드 박스)에서는 VM을 최대한 효율적으로 만드는 것 외에 다른 옵션이 없습니다. 따라서 유일한 옵션은 스크립트 코드를 사용하여 광선 추적 프로그램 구현을 참조하십시오.

서로 다른 우선 순위와 동기 부여.

Sciter 에서는 기본적으로 거의 완전한 jQurey 코어를 구현하여 테스트했습니다. ScIDE (HTML / CSS / Script로 제작 된 IDE) 와 같은 실제 작업에서 이러한 솔루션은 모든 VM 최적화보다 훨씬 잘 작동한다고 생각합니다.


5

다른 사람들이 언급했듯이 Python에는 PyPy 형식의 성능 JIT 컴파일러가 있습니다.

의미있는 벤치 마크를 만드는 것은 항상 미묘하지만 다른 언어로 작성된 K- 평균에 대한 간단한 벤치 마크가 있습니다 . 여기서 확인할 수 있습니다 . 제약 조건 중 하나는 다양한 언어가 모두 동일한 알고리즘을 구현해야하며 속도에 최적화 된 것과 달리 단순하고 관용적이되도록 노력해야한다는 것입니다. 나는 모든 구현을 썼기 때문에 내가 속인 것이 아니라는 것을 알고 있지만 모든 언어에 대해 내가 작성한 것이 관용적이라고 주장 할 수는 없다 (나는 그 중 일부에 대한 지식 만 가지고있다).

나는 확실한 결론을 주장하지는 않지만 PyPy는 내가 얻은 가장 빠른 구현 중 Node보다 훨씬 뛰어났습니다. 대신 CPython은 순위가 가장 느린 끝에있었습니다.


5

진술은 사실이 아닙니다

V8이 JS에 대한 구현 인 것처럼 CPython은 Python에 대한 하나의 구현 일뿐입니다. Pypy는 V8과 일치하는 성능을 가지고 있습니다. 있습니다.

또한, 감지 된 성능의 문제가 있습니다. V8은 기본적으로 비 차단이므로 웹 개발은 IO 대기 시간을 절약하기 때문에보다 성능이 뛰어난 프로젝트로 이어집니다. 그리고 V8은 IO가 중요한 dev 웹에 주로 사용되므로 비슷한 프로젝트와 비교합니다. 그러나 웹 개발자 이외의 많은 다른 영역에서 Python을 사용할 수 있습니다. 또한 과학 계산 또는 암호화와 같은 많은 작업에 C 확장을 사용하고 성능이 뛰어난 데이터를 처리 할 수 ​​있습니다.

그러나 웹에서 가장 인기있는 Python 및 Ruby 프로젝트가 차단되고 있습니다. 특히 파이썬은 동기식 WSGI 표준의 유산을 가지고 있으며 유명한 장고와 같은 프레임 워크가이를 기반으로합니다.

Twisted, Tornado, gevent 또는 asyncio와 같은 비동기 Python 또는 Ruby를 작성할 수 있습니다. 그러나 자주 수행되지는 않습니다. 가장 좋은 도구는 여전히 차단 중입니다.

그러나 Ruby와 Python의 기본 구현이 V8만큼 빠르지 않은 이유가 있습니다.

경험

Jörg W Mittag가 지적했듯이 V8에서 일하는 사람들은 VM 천재입니다. Python은 열정적 인 사람들이 많이 사용하며 많은 도메인에서 매우 뛰어나지 만 VM 튜닝에 특화된 것은 아닙니다.

자원

파이썬 소프트웨어 재단은 돈이 거의 없습니다 : 파이썬에 투자하는 데 1 년에 40k 미만 입니다. 구글, 페이스 북 또는 애플과 같은 대기업들이 모두 파이썬을 사용하고 있다고 생각할 때 이것은 다소 미쳤다. 그러나 추악한 진실이다. 대부분의 작업은 무료로 이루어진다. 유튜브에 힘을 실어주고 Java보다 존재했던 언어는 자원 봉사자들에 의해 수작업으로 만들어졌습니다.

그들은 현명하고 헌신적 인 자원 봉사자이지만, 현장에서 더 많은 주스가 필요하다고 판단되면이 분야의 최고 전문가를 고용하도록 300k를 요청할 수 없습니다. 그들은 무료로 그것을 할 누군가를 둘러보아야합니다.

이것이 작동하는 동안, 우선 순위에 대해 매우 신중해야 함을 의미합니다. 따라서 이제 다음을 살펴 봐야합니다.

목표

최신의 최신 기능을 사용하더라도 Javascript 작성은 끔찍합니다. 범위 지정 문제, 수집 횟수가 거의 없음, 끔찍한 문자열 및 배열 조작, 날짜, 수학 및 정규 표현식을 제외한 stdlist가 거의 없으며 매우 일반적인 작업에서도 구문 설탕이 없습니다.

그러나 V8에서는 속도가 향상되었습니다.

Chrome의 페이지 렌더링에 병목 현상이 있기 때문에 속도는 Google의 주요 목표 였기 때문입니다.

파이썬에서 유용성은 주요 목표입니다. 프로젝트에서 병목 현상이 발생하지 않기 때문입니다. 여기서 부족한 리소스는 개발자 시간입니다. 개발자에게 최적화되어 있습니다.


1

JavaScript 구현은 바인딩의 하위 호환성에 신경 쓸 필요가 없기 때문입니다.

최근까지 JavaScript 구현의 유일한 사용자는 웹 브라우저였습니다. 보안 요구 사항으로 인해 웹 브라우저 공급 업체 만 런타임에 바인딩을 작성하여 기능을 확장 할 수있는 권한이있었습니다. 따라서 바인딩의 C API를 이전 버전과 호환 가능하게 유지할 필요가 없었습니다. JavaScript 런타임이 발전함에 따라 웹 브라우저 개발자가 소스 코드를 업데이트하도록 요청할 수있었습니다. 그들은 어쨌든 함께 일하고있었습니다. 게임의 후발 자이자 경험이 많은 개발자가 이끄는 V8조차도 API가 개선되면서 API를 변경했습니다.

OTOH Ruby는 주로 서버 측에서 사용됩니다. 많이 사용되는 루비 확장은 C 바인딩으로 작성됩니다 (RDBMS 드라이버 고려). 다시 말해, 루비는 호환성을 유지하지 않으면 결코 성공하지 못했을 것입니다.

오늘날에도 그 차이는 여전히 어느 정도 존재합니다. node.js를 사용하는 개발자는 V8이 시간이 지남에 따라 API를 변경하기 때문에 기본 확장 기능을 이전 버전과 호환하는 것이 어렵다고 불평하고 있습니다. IIRC 루비는 여전히 이런 측면에서 훨씬 보수적 인 접근 방식을 취하고 있습니다.


1

V8은 JIT, Crankshaft, 타입 추론 자 및 데이터 최적화 코드로 인해 빠릅니다. 태그가 붙은 포인터, NaN 태그의 복식. 물론 중간에 일반적인 컴파일러 최적화를 수행합니다.

평범한 루비, 파이썬 및 펄 엔진은 그 중 어느 것도 수행하지 않고 사소한 기본 최적화입니다.

유일하게 접근하는 유일한 주요 vm은 luajit으로 타입 추론, 상수 폴딩, NaN 태깅 또는 정수조차하지 않지만 나쁜 언어만큼 지방이 아닌 유사한 작은 코드 및 데이터 구조를 사용합니다. 그리고 내 프로토 타입 동적 언어 인 potion과 p2는 luajit과 비슷한 기능을 가지고 있으며 v8보다 뛰어납니다. 옵션 타입 시스템 인 "점진적 타이핑"을 사용하면 크랭크 샤프트를 우회 할 수 있으므로 v8보다 쉽게 ​​성능을 능가 할 수 있습니다. 다트를 참조하십시오.

pypy 또는 jruby와 같은 알려진 최적화 된 백엔드는 여전히 다양한 오버 엔지니어링 기술로 어려움을 겪고 있습니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.