2014-01-29 39 views
1

我想查找Android應用程序的機器指令總數。我已經探索了Android SDK的Debug.InstructionCount類,但我相信它提供了Dalvik VM指令的信息(不是實際在處理器上執行的機器級指令)。 我需要此信息來估計在特定處理器上執行Android應用程序所需的時間(使用固定頻率)。我意識到不同類型的指令需要變量循環,因爲計算時間無法準確估計,但我仍然想做一些實驗。謝謝如何查找程序的總數指令?

+0

爲什麼不使用在特定設備上運行它,然後猜測它可能會在另一個設備上運行多長時間? – auselen

回答

1

我的解決方案涉及到編寫指令集模擬器,運行應用程序並計算指令。目前已有開源avr模擬器,您只能使用/修改它。

在一天結束時,爲了做到這一點,您必須遵循指令流程,所以要麼實際上模擬它,並自動解決代碼真正經歷循環的次數,或者您編寫反彙編程序(它是模擬器的一半),基本上按照執行順序執行代碼流程(實際上比完整的反彙編程序或模擬程序簡單得多),但是您必須處理所有可能的代碼路徑和循環,因爲您會發現不同的路徑和計數不同的路徑。只需很少的工作,你就可以想出儘可能短的路徑,並知道代碼永遠不會比這更快。

+0

是的,一個模擬將不得不通過與真實硬件延遲相關的循環來處理真實世界的次數。 –

+0

+1。 * Avr *或* ARM *? :)。不幸的是,模擬器的指令數可能取決於數據;這對於Java/Davlik來說尤爲重要,因爲某些指令比其他指令更昂貴(超出界限等)。另外,一條指令可能會影響下一條指令的執行速度等。請參閱:[Objdump和ARM cycles](http://stackoverflow.com/questions/14942436/post-process-objdump-disassemble-with-arm-cycle-計數),在那裏你採取了反面。瞭解限制總是有幫助的。 –

+0

大聲笑,我讀了Android並且認爲Arduino,但是如果你想知道你正在執行多少指令(這意味着執行順序),你必須按照執行順序對它們進行計數,答案也是一樣的。如果您想計算arm,avr,mips,java字節碼,llvm位碼,pascal pcode等等,那麼也是一樣的過程。 –