2012-12-10 38 views
6

Tôi sẽ tham gia cuộc thi battlecode của MIT. Những người tham gia viết các chương trình điều khiển robot chiến đấu với nhau. Bắt là robot của bạn bị hạn chế để thực hiện một số tiền nhất định của bytecode trong một lượt (năm ngoái là 10000 mỗi lượt). Bây giờ, một vòng lặp đơn giản nhưCách đếm số bytecode được thực hiện trong java

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

sử dụng, theo phần mềm của họ, khoảng 400 bytecode (có lẽ là một cái gì đó giống như (2 bytecode cho incrementing i cộng với 2 bytecode để kiểm tra nếu tôi < 100) * 100 = 400 bytecode) vì vậy chúng tôi phải viết mã rất chặt chẽ. Do đó, khi tôi thử một số thuật toán điều hướng khác nhau, điều quan trọng là tôi có thể tìm ra mã bytecode mà tôi đang sử dụng - làm cách nào tôi có thể thực hiện điều này?

(Có thể - họ làm điều đó, tôi chỉ không chắc chắn như thế nào! Ngoài ra, họ phải dừng JIT đi vào chơi bằng cách nào đó. Tôi biết rằng mỗi robot được chạy trong một Chủ đề riêng biệt, vì vậy tôi ' m chắc chắn câu trả lời liên quan đến một số loại chủ đề thủ đoạn gian trá tôi không biết về)

+0

Nếu bạn đang được đo bằng số lượng lệnh được thực thi, có thể bạn sẽ muốn viết bytecode bằng tay. Trình biên dịch Java dịch một cách mù quáng nguồn của bạn thành bytecode mà không tối ưu hóa, có nghĩa là nó có rất nhiều lệnh dư thừa. Thông thường đây không phải là vấn đề vì VM tối ưu hóa chúng đi, nhưng nó sẽ làm tăng số lượng lệnh của bạn. Bạn có thể làm tốt hơn rất nhiều bằng cách viết bytecode trực tiếp. – Antimony

Trả lời

5

bạn có thể lấy số liệu bằng cách sử dụng bản dựng gỡ lỗi của JVM Hotspot (whic h có thể được tìm thấy here) và chạy nó với cờ -XX:+CountBytecodes.

+0

Nếu tôi tải xuống và chạy nó trên một tệp lớp được biên dịch bởi javac 1.7.0_09 tôi gặp lỗi "Unsupported major.minor phiên bản 51.0". Có một trình biên dịch khác nhau tôi nên sử dụng? – andyInCambridge

+0

tốt, tôi đã liên kết đến java 6 vm, vì vậy điều đó không đáng ngạc nhiên :) Tôi không biết về một bản dựng lỗi của java 7 vm có sẵn trực tuyến, vì vậy tốt nhất bạn nên cài đặt trình biên dịch java 6 và biên dịch lại. Ngoài ra, bạn có thể biên dịch java 7 vm của riêng bạn, nhưng tôi nghĩ rằng đó sẽ là một rắc rối. – int3

+0

Bạn cũng sẽ phải chỉ định -XX: -UseCompiler hoặc mã khác sẽ được biên dịch thành gốc và sau đó nó sẽ không được tính. –

Các vấn đề liên quan