2009-02-10 4 views
8

교수님은 한 번 해석하면 해석 된 코드가 컴파일 된 것보다 약 10 배 더 느리다는 것을 기억합니다. 해석과 바이트 코드의 속도 차이는 무엇입니까? (바이트 코드가 JIT 컴파일되지 않는다고 가정 할 때)바이트 코드 해석

어떤 사람들은 vim 스크립트를 바이트 코드로 컴파일한다는 생각을하고 있으며 나는 어떤 종류의 성능 향상을 가져올 지 궁금합니다.

+0

바이트 코드가 해석됩니다. 소스 코드 대 바이트 코드가 더 좋을 것입니다. –

+1

소스 코드는 나에게 컴파일 된 것을 의미합니다. – Whaledawg

+0

@Whaledawg byecode도 컴파일 할 수 있습니다. –

답변

7

바이트 코드를 컴파일 할 때 우선 값 비싼 고급 최적화를 수행 할 수 있습니다. 바이트 코드를 매우으로 쉽게 설계하여 컴퓨터 코드로 컴파일하고 모든 최적화 및 흐름 분석을 미리 실행하십시오.

따라서 속도 향상은 잠재적으로 상당히 상당합니다. 런타임에 전체 렉싱/파싱 단계를 건너 뛰는 것뿐만 아니라 최적화를 적용하고 더 나은 시스템 코드를 생성 할 수있는 기회가 더 많습니다.

+0

가장 널리 쓰이는 바이트 코드 기반 플랫폼 인 Java가 무엇을 기반으로하는지 완전히 잘못되었습니다. 소스 코드 컴파일 중에 최적화가 거의 이루어지지 않았습니다. 대부분의 최적화는 JIT 컴파일러에 의해 수행되며 JVM은 실제 명령어 세트에 전혀 잘 매핑되지 않는 스택 기반 아키텍처입니다. –

+1

그는 Java에 대해 묻지 않고 있습니다. 그는 일반적으로 바이트 코드에 대해 질문하고 있습니다. 인터프리터에서 바이트 코드/JIT로 이동하면 초기 최적화를 수행하고 기계 언어와 잘 매핑되는 바이트 코드를 선택할 수 있습니다. 자바의 설계자는 자신이 수행 한 바이트 코드를 선택할 이유가 있었지만이를 수행하는 유일한 방법은 아닙니다. – Eclipse

3

꽤 좋은 부스트를 볼 수 있습니다. 그러나 많은 요소가 있습니다. 컴파일 된 코드가 항상 해석 된 코드보다 약 10 배 빠르거나 바이트 코드가 해석 된 코드보다 n 배 빠르다고 말할 수는 없습니다.

요인에는 언어의 복잡성과 자세한 정보가 포함됩니다. 언어의 키워드가 여러 문자이고 바이트 코드가 하나 인 경우 바이트 코드를로드하고 해당 바이트 코드를 처리하는 루틴으로 점프하는 것이 키워드 문자열을 읽는 것보다 빠릅니다. 어디로 가야. 그러나 1 바이트 키워드가있는 이국적인 언어 중 하나를 해석하는 경우 차이가 눈에 띄지 않을 수 있습니다.

실제로이 성능 향상을 보았으므로 그만한 가치가 있습니다. 게다가, 그런 일을 쓰는 것은 재미 있고, 언어 통역사와 컴파일러가 어떻게 작동하는지에 대한 느낌을주고, 그러면 더 좋은 코더가 될 것입니다.

+0

어디에서 시작하나요? 나는 대학에서 컴파일러를 썼지 만 아주 단순한 언어 였기 때문에 바이트 코드 인터프리터 작성을 상상할 수도 없다. – Whaledawg

+0

대부분의 어려운 작업은 우선 바이트 코드로 컴파일 될 것입니다. 그 후에는 인터프리터가 영광스러운 상태 시스템이 될 것입니다. 바이트 코드를 직접 사용하여 루틴 배열에 색인을 지정하면됩니다. JIT를 원한다면 어려워 질 것입니다. – Eclipse

+0

필자는 현재 이것에 대한 조언을 줄 수 없다. 언젠가 80 년대 바이트 코드로 컴파일 된 컴파일러를 썼다. 오하이오 사이언 티픽 C1P에서 6502 어셈블러에 있었다. 그럼, 사물이 바뀌었을 수도 있습니다.) –

0

가상 머신에 따라 다릅니다. 일부 빠른 가상 시스템 (JVM)은 C 코드의 속도에 다가 섰습니다. 그러면 해석 된 코드가 C에 비해 얼마나 빨리 실행됩니까?

해석 된 코드를 ByteCode로 변환하면 Java (C 속도 근처)로 실행될 것이라고 생각하지 마십시오. 몇 년 동안 성능이 향상되었지만 상당한 속도 향상이 있어야합니다.

Emacs은 향상된 성능으로 바이트 코드로 이식되었습니다. 당신에게보기에 가치가 있을지도 모른다.

0

내가 느낄 정도로 느린 Vim 스크립트를 본 적이 없다. 스크립트가 주로 내장, 원시 코드, 편집기의 핵심에 구현 된 연산 (정규 표현식, 블록 연산 등)을 호출한다고 가정하면 스크립팅에서 '글루 로직'의 10 배 속도는 중요하지 않습니다.

여전히 프로파일 링 만이 실제로 확실합니다.

1

요즘 실제로 코드를 컴파일하지 않는 주류 "인터프리터"가 있습니까? (바이트 코드 또는 이와 유사한 것)

예를 들어, 소스 코드에서 직접 Perl 프로그램을 사용하는 경우 소스 코드를 구문 트리로 컴파일 한 후이를 최적화하고 사용합니다. 프로그램을 실행하십시오. 정상적인 상황에서 컴파일하는 데 걸리는 시간은 프로그램을 실제로 실행하는 시간과 비교할 때 아주 적습니다.

분명히 Perl은 C로 작성 되었기 때문에 잘 최적화 된 C 코드보다 빠를 수 없습니다. 실제로는 일반적으로 텍스트 처리와 같은 Perl을 사용하여 수행 할 대부분의 작업에 대해 당신이 합리적으로 C로 코드화 할 수있는 것처럼 빨리, 그리고 쓰는 것이 더 쉬운 순서로. 다른 한편, Perl에서 고성능 수학 루틴을 직접 작성하려고하지는 않습니다.

+1

Ruby 1.8 (MRI)은 바이트 코드가 아닌 AST 워커를 사용합니다. 그래도 전체 구문 분석을 수행합니다. –

1

또한 "고전적인"인터프리터에는 실행과 함께 lex/parse 단계가 포함되어 있습니다.

예를 들어, Python 스크립트를 실행 해보십시오. 그렇게하면 프로그램 텍스트를 내부 인터프리터 데이터 구조로 변환 한 다음 실행되는 모든 비용이 발생하게됩니다.

이제 컴파일 된 Python 스크립트 인 .pyc 파일을 실행하는 것과는 대조적입니다. 여기에서 lex 및 구문 분석 단계가 완료되고 내부 해석기의 런타임 만 있습니다.

그러나 기본 BASIC 인터프리터를 고려하면 일반적으로 원시 텍스트를 저장하지 않고 토큰 화 된 양식을 저장하고 "LIST"를 할 때 프로그램 텍스트를 다시 만듭니다. 여기서 바이트 코드는 훨씬 더 복잡합니다 (실제로 여기에는 가상 머신이 없습니다). 그러나 실행은 텍스트 처리 중 일부를 건너 뜁니다. 줄을 입력하고 Enter 키를 누르면 모두 완료됩니다.