如何计算在java中执行的字节码数

Posted

技术标签:

【中文标题】如何计算在java中执行的字节码数【英文标题】:How to count number of bytecodes executed in 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 【参考方案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/

【讨论】:

以上是关于如何计算在java中执行的字节码数的主要内容,如果未能解决你的问题,请参考以下文章

JVM技术专题 字节码指令集调用执行流程分析「语法分析篇」

JVM原理探索字节码指令集调用执行流程分析(语法分析篇)

BTrace 动态追踪技术

JVM进阶之字节码指令概述

Java字节码的执行是由啥完成的?

如何在运行时发出和执行 Java 字节码?