Как найти общее количество инструкций программы?

Я хочу найти общее количество машинных инструкций приложения Android. Я изучил класс Debug.InstructionCount Android SDK, но я считаю, что он предоставляет информацию об инструкциях Dalvik VM (а не инструкциях машинного уровня, которые фактически выполняются на процессоре). Мне нужна эта информация, чтобы оценить время, необходимое для выполнения приложения Android на конкретном процессоре (с использованием фиксированной частоты). Я знаю, что разные типы инструкций занимают переменные циклы, из-за чего время вычислений нельзя точно оценить, но я все же хочу поэкспериментировать. Спасибо


person atta    schedule 29.01.2014    source источник
comment
почему бы просто не запустить его на определенном устройстве, а затем угадать, сколько времени это может занять на другом устройстве?   -  person auselen    schedule 30.01.2014


Ответы (1)


Мое решение включает в себя написание симулятора набора инструкций, запуск приложения и подсчет инструкций. Уже существуют симуляторы avr с открытым исходным кодом, которые вы можете просто использовать/модифицировать для этого.

В конце концов, чтобы сделать это, вы должны следовать потоку инструкций, поэтому либо вы на самом деле моделируете его, и это автоматически решает, сколько раз код действительно проходит через цикл и т. д., либо вы пишете дизассемблер (который половина симулятора) и в основном следовать потоку кода в порядке выполнения (на самом деле намного проще, чем полный дизассемблер или симулятор), но вам приходится иметь дело со всеми возможными путями кода и циклами, когда вы находите разные пути и подсчитываете разные пути. С минимальными усилиями вы можете найти кратчайший путь и знать, что код никогда не будет быстрее этого.

person old_timer    schedule 29.01.2014
comment
да, симу пришлось бы иметь дело с реальным количеством циклов, связанных с реальными аппаратными задержками. - person old_timer; 29.01.2014
comment
+1 за попытку. Avr или ARM? :). К сожалению, количество инструкций в симуляторе может зависеть от данных; это особенно важно для Java/Davlik, поскольку некоторые инструкции намного дороже (за пределами допустимого и т. д.), чем другие. Кроме того, одна инструкция может влиять на скорость выполнения следующей и т. д. См.: Objdump и циклы ARM, где вы приняли противоположную сторону. Знание ограничений всегда полезно. - person artless noise; 29.01.2014
comment
LOL, я читал Android и думал об Arduino, но ответ тот же, если вы хотите знать, сколько инструкций вы выполняете (то есть в порядке выполнения), вы должны посчитать их в порядке выполнения. Тот же процесс, если вы хотите подсчитать arm, avr, mips, байт-код java, бит-код llvm, pascal pcode и так далее. - person old_timer; 30.01.2014
comment
бесхитростный шум плакат знает о различной природе инструкций и все еще просто хочет количество инструкций. - person old_timer; 30.01.2014