2017-02-13 30 views
0

我試圖用ASM計數單一功能內執行,以建立一個直方圖個人字節碼指令。我看到有一個工具ByCounter可以執行類似的任務 - 但我無法訪問源代碼。的Java計算單個字節碼指令執行

我的理解是Java字節碼的ASM庫可以儀器類,字段,方法,但它的實例插裝一個單獨的字節碼指令都沒有被發現(雖然從ByCounter - 它被認爲是可能的)。

如果像JVMTI工具更適合,那麼這也是有用的信息!

感謝您的幫助!

+3

你有什麼計劃使用這些信息?如果你試圖分析或優化程序,那麼字節碼並不是JIT最終會運行的 - 它會在運行時將一切完全不同的本地代碼重寫。 –

+0

你不能只是訪問方法的['instructions'(http://asm.ow2.org/asm50/javadoc/user/org/objectweb/asm/tree/MethodNode.html#instructions),並檢查[' size'](http://asm.ow2.org/asm50/javadoc/user/org/objectweb/asm/tree/InsnList.html#size--)? –

+0

@LouisWasserman我想查看在不同代碼路徑的方法中執行了多少條指令。我同意這是一個不完美的方法,但它是開始獲得一些基準指標。 – Mike

回答

0

這是那種我對做Jawa愚蠢的事情。例如:

from collections import Counter 
from jawa.cf import ClassFile 
import pandas 


with open('tests/data/HelloWorldDebug.class', 'rb') as fin: 
    cf = ClassFile(fin) 

    method = cf.methods.find_one(name='<init>') 

    ins = Counter(i.mnemonic for i in method.code.disassemble()) 

    df = pandas.DataFrame.from_dict(ins, orient='index') 
    fig = df.plot(kind='bar').get_figure() 
    fig.savefig('example.png') 

histogram

+0

這似乎產生一個方法的指令*包含*的直方圖,而不是實際*執行的指令* ... – Holger

+0

你是完全正確的,這是我錯過的關鍵詞。沒有記錄的'Context()'類可以用來在一個普通的JVM中運行該方法,但顯然會給出比真實的JVM非常不同的結果。 – TkTech

+0

@TkTech那裏有很好的直方圖,謝謝分享。我會需要一個直方圖,但是在前面提到的方法中,需要在運行時的字節碼計數。 – Mike