【问题标题】:How to count number of bytecodes executed in java如何计算在java中执行的字节码数
【发布时间】:2012-12-10 23:28:14
【问题描述】:

我要参加麻省理工学院的战斗密码竞赛。参赛者编写程序来控制互相战斗的机器人。问题是你的机器人被限制在一个回合中执行一定数量的字节码(去年是每回合 10000 个字节码)。现在,一个简单的循环 喜欢

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

根据他们的软件,使用大约 400 个字节码(大概类似于 (用于递增 i 的 2 个字节码加上 2 个字节码 用于检查 i

(有可能——他们做到了,我只是不知道怎么做!而且,他们必须阻止 JIT 以某种方式发挥作用。我知道每个机器人都在单独的线程中运行,所以我当然 答案涉及某种我不知道的 Thread 诡计。)

【问题讨论】:

  • 如果您以执行的指令数量来衡量,您可能希望手动编写字节码。 Java 编译器盲目地将你的源代码翻译成字节码,没有优化,这意味着它有大量的冗余指令。通常这不会成为问题,因为 VM 会优化它们,但它会增加你的指令数。直接写字节码可以做得更好。
  • 这篇帖子e 给出了解决这个问题的工作代码sn-p

标签: java jvm bytecode


【解决方案1】:

您可以通过使用 Hotspot JVM 的调试版本(可以在 here 找到)并使用 -XX:+CountBytecodes 标志运行它来获取计数。

【讨论】:

  • 如果我下载它并在 javac 1.7.0_09 编译的类文件上运行它,我会收到错误“Unsupported major.minor version 51.0”。我应该使用不同的编译器吗?
  • 好吧,我确实链接到了 java 6 vm,所以这并不奇怪 :) 我不知道可以在线获得 java 7 vm 的调试版本,所以最好的办法是安装java 6编译器并重新编译。或者,您可以自己编译 java 7 vm,但我认为这会比较麻烦。
  • 您还必须指定 -XX:-UseCompiler 否则代码将被编译为本机,然后它不会被计算在内。
【解决方案2】:

查看their source code,他们使用asm字节码操纵器http://asm.ow2.org/进行计数。

【讨论】:

  • 很遗憾链接不可用
【解决方案3】:

你可以像这样生成你的字节码:

javac Employee.java
javap -c Employee > Employee.bc

来源:http://www.ibm.com/developerworks/ibm/library/it-haggar_bytecode/

【讨论】:

    猜你喜欢
    • 2022-01-03
    • 2017-07-02
    • 2014-09-26
    • 1970-01-01
    • 1970-01-01
    • 2011-04-30
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    相关资源
    最近更新 更多