2012-02-29 3 views
5

C# 및 Java와 같은 JITed 언어를 선호하는 인수는 가상 컴퓨터의 런타임 프로파일 링이 정적으로 최적화 된 C++ 코드보다 코드를 최적화 할 수 있기 때문에 더 나은 최적화를 수행 할 수 있다는 것입니다.성능 최적화를위한 C++ 용 가상 컴퓨터

그러나 C++이나 다른 유사한 언어의 런타임시 코드를 최적화하기 위해 가상 시스템을 사용할 수 있는지 궁금합니다. 예를 들어, LLVM 컴파일러에서 생성 한 IR을 가져 와서 Java 및 C#의 경우와 마찬가지로 해석하고 JIT 및 코드를 최적화하는 가상 시스템을 만들 수 있습니다.

물론 가비지 수집은 없지만 최적화 요소가있을 것입니다. 누구든지이 일을 했나요? 여기에 서류 나 도구가 있습니까? 이 접근은 얼마나 좋은가?

+3

[ "Clang"+ "JIT"] (https://www.google.com/search?q=clang+jit)에 대한 Google 검색은 많은 정보를 가져옵니다. – ruakh

+1

Google은 Chrome을 업데이트 할 때 흥미로운 작업을 수행합니다 ... 프로그램이 부분적으로 디 컴파일되어 다소 상징적 인 양식을 얻은 다음 해당 양식에 대한 패치로 적용한 다음 다시 컴파일합니다. 또한, 사람들이 런타임에 스스로 다시 작성하는 다형성 프로그램을 작성하는 시대로 돌아 왔습니다 (예를 들어'if' 조건이 결코 거짓이 아니라는 것을 감지하면 명령을'nop'으로 대체합니다). 따라서 이것이 가능하지 않아야하는 이유는 없습니다. 나는 "가능하다"라는 말조차하지 않고있다. 왜냐하면 우리는 그것이 사실이라는 것을 알고 있기 때문이다. –

+0

그들은 실제로 더 나은 최적화를 할 수 있지만 그렇지 않습니다. –

답변

2

이론적으로 말하면 네, JIT는 C++ 용으로 만들 수 있습니다. 적극적으로 코드를 최적화하기 위해 기본 아키텍처의 일부 기능을 활용할 수 있습니다. 런타임시 응용 프로그램로드 시간이 오래 걸리는 단점도 있습니다.

물론, 가비지 수집이 없으므로 이로 인해 오버 헤드가 발생하지만 최적화 요인이있을 것입니다. 누구든지이 작업을했습니다. 여기에 서류 나 도구가 있습니까? 얼마나 좋은 이 접근 방식이 될 것입니까?

큰 오해. 모든 사용자 정의 유형에 대해 GC를 부과하는 것은 큰 오버 헤드입니다. 초기에 관리 대상 VM 만 사용하려는 시도를 시작 했음에도 불구하고 Android, iOS 및 Windows 모바일이 모두 고성능 애플리케이션을 위해 C/C++로 전환 한 이유 중 하나입니다.

물론 간접적 인 추가 수준은 GC가 컴팩트 메모리와 같은 일을 할 수 있다는 것을 의미하지만, 최적화 된 C/C++ 프로그램은 이미 압축 된 메모리로 처음부터 작업 할 것입니다. 또한 메모리가 처음에는 더 조각 나기 때문에 C++에서 잘 작동하는 종류의 고성능 응용 프로그램 (예 : 비디오 처리, 광선 추적 또는 오디오와 같은 크고 연속적인 버퍼 처리 처리).

또한 모든 UDT 인스턴스를 참조로 바꾸면 모든 것이 힙에 있음을 의미합니다. 원래는 몇 클럭주기의 작업을 실제로 수백 개로 바꿔 버렸습니다.

그렇다면 JIT를 사용하여 C++ 코드를 빌드 할 수는 있지만 확실한 이유는 없다는 것을 알 수 있습니다. 사람들은 일반적으로 C++ 코드로 작업합니다.

+1

"가비지 컬렉션이 없으므로 이로 인한 오버 헤드가 없습니다"라고 말하면 가비지 수집이 없으므로 오버 헤드가 줄어들 것입니다. 당신은 그것을 다른 방법으로 읽습니다 :)! – MetallicPriest

+0

@MetallicPriest 오, 이런, 그 문장은 GC 부족으로 인해 오버 헤드가 발생한다는 것을 의미한다고 생각했습니다. 저는 C#/Java 애호가들에게 GC가 어떤 식 으로든 더 빠르게 작업한다고 주장하는 경우가 많았습니다. 찾고 있지 않을 때 메모리를 압축 할 수 있다는 사실은 사실입니다.하지만 C++에서는 사용자 정의 유형의 연속 된 소형 배열을 만들 수 있습니다. (예 : 매트릭스) 처음부터. – stinky472

4

LLVM에는 JIT 컴파일러 인 lli가 있으며 Clang은 이미 C++에서 비트 코드를 생성 할 수 있습니다. 나는 그것을 시도하지는 않았지만, 생성 된 비트 코드 파일에 lli를 사용할 수 있다고 가정한다. 런타임에 런타임에 JIT C++와 링크 할 C++ lib 파일을 어디에서 찾을 수 있는지 말해야 할 것이다. JITed 될 수 있도록 비트 코드로 libC++을 빌드 할 수 있어야합니다.

Google의 Native Client에는 Portable Basic Client라는 하위 프로젝트가 있습니다.이 프로젝트에서는 x86 바이너리 대신 LLVM IR이 클라이언트에 보내어 클라이언트에 전송됩니다.

7

이것은 잘못된 인수입니다. 예, 가상 머신은 더 많은 정보를 가지고 있습니다.하지만 컴파일러에 비해 시간과 공간이 훨씬 적습니다.

네, 정말로 원한다면 절대적으로 할 수 있습니다. 그러나 아무도하지 않기 때문에 일반적으로 일어나지 않습니다.적어도 최적화상의 이유가 아니라 샌드 박스 작업을 위해 할 수 있습니다.

+1

당신은 이미 많은 최적화를 할 수있는 시점에서 C++을 Clang처럼 바이트 코드로 프리 컴파일 할 수 있습니다. – Xeo

+1

@Xeo : 이론적으로 그렇습니다. 하지만 C/C++ 옵티마이 저는 상당히 오래된 컴퓨터 용어로 비교적 잘 작동합니다. 따라서 추가 성능 향상은 무시해도 좋습니다. 누군가가 그것에 종이를 게시하는 것을 보는 것이 좋을 것입니다. –

관련 문제