2012-12-10 3 views
6

MIT의 전투 코드 경쟁에 참가할 것입니다. 참가자들은 서로 싸우는 로봇을 제어하는 ​​프로그램을 작성합니다. 잡기는 로봇이 한 번에 일정량의 바이트 코드를 실행하는 것으로 제한된다는 것입니다 (작년에는 10000 번). 지금, 간단하게 루프 자바에서 실행 된 바이트 코드 수를 계산하는 방법

(int i=0; i<100; i++){ 
// do nothing 
} 

용도를 확인하기 위해 난 더하기 2를 바이트 를 증가 용 (2 바이트 코드와 같은, 자신의 소프트웨어에있어서, 약 400 바이트 (아마도 것이 있다면 < 100) * 100 = 400 바이트 코드) 그래서 우리는 매우 엄격한 코드를 작성해야합니다. 따라서, 다른 탐색 알고리즘을 시도해 볼 때 코드가 얼마나 많은 바이트 코드를 사용하는지 파악할 수 있어야합니다. 어떻게하면됩니까?

(가능한 경우 - 어떻게할지는 모르겠지만, JIT가 어떻게 든 작동하지 않도록해야합니다. 각 로봇이 별도의 스레드에서 실행된다는 것을 알고 있으므로, m은 확실히 대답은 내가 모르는 스레드 속임수의 일종을 포함한다)

+0

실행 된 명령어의 수를 측정하는 경우 바이트 코드를 직접 작성해야합니다. Java 컴파일러는 소스 코드를 최적화하지 않고 맹목적으로 바이트 코드로 변환합니다. 즉, 많은 지침이 중복되어 있습니다. 일반적으로 VM은이를 최적화하기 때문에 문제가되지 않지만 명령 수는 증가합니다. 바이트 코드를 직접 작성하여 훨씬 잘 수행 할 수 있습니다. – Antimony

답변

5

당신은 수를 얻을 수 있습니다 핫스팟 JVM의 디버그 빌드를 사용하여 h는 here입니다) 그리고 -XX:+CountBytecodes 플래그로 실행하십시오.

+0

javac 1.7.0_09로 컴파일 된 클래스 파일에서 다운로드하여 실행하면 "지원되지 않는 major.minor 버전 51.0"오류가 발생합니다. 내가 사용해야하는 다른 컴파일러가 있습니까? – andyInCambridge

+0

글쎄, 나는 자바 6 VM에 대한 링크를 만들었다. 그래서 놀랍지 않다. 나는 온라인에서 사용할 수있는 자바 7 VM의 디버그 빌드를 알지 못한다. 그래서 가장 좋은 건 자바 6 컴파일러를 설치하고 다시 컴파일하는 것이다. 또는 자바 7 VM을 직접 컴파일 할 수도 있지만, 그게 더 번거로운 일이라고 생각합니다. – int3

+0

또한 -XX : -UseCompiler를 지정해야합니다. 그렇지 않으면 코드가 네이티브로 컴파일 된 다음 계산되지 않습니다. –

관련 문제