Измерение производительности 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" в настройках запуска.

Dart Editor IDE. Настройка параметров запуска приложения

3) Отладчик

Профилировать приложения стоит с отключенным отладчиком, потому что, это тоже вносит дополнительные издержки и сильно влияет на время выполнения кода.

Резюме

  • " Разогревайте" виртуальную машину Dart VM перед измерением производительности вашего приложения
  • Убедитесь, что в "checked" режиме нет никаких ошибок и предупреждений
  • Выполняйте измерение времени выполнения в "producation" режиме, и обязательно с отключенным отладчиком

Другие новости по теме: