Статьи » Измерение производительности dart-приложений
Измерение производительности dart-приложений
Практически всем разработчикам, рано или поздно приходится сталкиваться с оптимизацией производительности своих приложений, и для этих целей создано и используется множество различных инструментов, позволяющий собирать и анализировать разнообразную статистику, такую как время выполнения каждой функции или метода, использование памяти, время ожидания, и т.д. Но, к сожалению, в настоящий момент, для для языка Dart таких инструментов еще нет, и приходится пользоваться только возможностями самого языка.
Простейшим способом измерения времени выполнения какой-либо функции, или метода, является использование класс Stopwatch
:
var banchmarkTimer = new Stopwatch(); // Создаем экземпляр класса Stopwatch
banchmarkTimer.start(); // Запускаем отсчет времени
processUserFunction(); // Выполняем необходимую функцию
banchmarkTimer.stop(); // Останавливаем таймер
// Получаем время выполнения, с точностью до микросекунд.
var elapsedTime = banchmarkTimer.elapsedInUs();
Такой подход достаточно прост и универсален, и позволяет легко получить оценку времени выполнения любого куска программы. Но есть некоторые особенности работы виртуальной машины Dart VM, которые могут значительно исказить результаты измерений. John McCutchan, в своей статье на dartlang.org - http://www.dartlang.org/articles/profiling/, предлагает использовать несколько простых трюков, чтобы свести к минимуму дополнительные издержки, возникающие при профилировании программ:
1) "Разогрев" виртуальной машины и оптимизатора кода.
Виртуальная машина Dart VM спроектирована таким образом, чтобы, как можно быстрее запускать пользовательские приложения, и только потом, в процессе их выполнения, производить внутреннюю оптимизацию исполняемого кода. Таким образом, чтобы быть уверенным, что при измерении времени выполнения вашего метода или функции, производительность виртуальной машины максимальная, и оптимизатор кода завершил свою работу, необходимо выполнить исследуемый блок кода несколько раз, в простом цикле:
for (int i = 0; i < 2000; i++) {
processUserFunction();
}
2) Режим работы виртуальной машины
Приложения в виртуальной машине Dart VM могут выполнятся в двух режимах - "checked" и "production". В режим "checked" код выполняется значительно медленнее, чем в "producation", потому что проводятся дополнительные проверки на соответствие типов переменных, и генерируются соответствующие ошибки и предупреждения. Поэтому анализировать время выполнения вашего кода стоит только в режиме "producation", но предварительно убедившись, что в "checked" режиме нет никаких ошибок и предупреждений, так как они могут вызвать падение производительности.
- Во время запуска из командной строки по умолчанию используется режим "producation", а переключить в "checked" можно с помощью ключа
--checked
. - Во время запуска из IDE Dart Editor наоборот по умолчанию используется режим "checked", а переключать режимы можно с помощью галочки "Run in checked mode" в настройках запуска.
3) Отладчик
Профилировать приложения стоит с отключенным отладчиком, потому что, это тоже вносит дополнительные издержки и сильно влияет на время выполнения кода.
Резюме
- " Разогревайте" виртуальную машину Dart VM перед измерением производительности вашего приложения
- Убедитесь, что в "checked" режиме нет никаких ошибок и предупреждений
- Выполняйте измерение времени выполнения в "producation" режиме, и обязательно с отключенным отладчиком