Небольшой тест скорости QCoreApplication

в 16:08, , рубрики: callgrind, performance, qt, Qt Software, qt5, valgrind

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

В своё время, Qt4 была разделена на несколько модулей, что в частности позволило создавать приложения, не требующих графического интерфейса. Благодаря сильной фокусировке на архитектуре встраиваемых систем и нескольким здравомыслящим решениям в области архитектуры, Qt5 вывела данный подход на новый уровень.

Давайте посмотрим на простую функцию:

QCoreApplication app(argc, argv);
QTimer::singleShot(3000, &app, SLOT(quit()));
return app.exec();

Это Qt-приложение, не имеющее графического интерфейса. Оно работает 3 секунды и затем завершается.

На моей Kubuntu 12.04 со стандартным ядром и Qt 4.8.1 Valgrind показывает пиковое использование кучи в 102 кб, в то время как Callgrind сообщает о выполнении 1.9 (*) миллиона инструкций процессора.

Давайте посмотрим на цифры полученные на сегодняшней сборке Qt 5: Valgrind сообщает 4,9 Кб выделения памяти в куче, а Callgrind сообщает примерно о 114 000 инструкций процессора.

Это означает, что Qt 5 использует примерно в 20 раз меньше памяти и примерно в 16 раз меньше инструкций процессора в конструкторе QCoreApplication и на выполнение Event-loop.

Есть несколько причин для этого. В частности, Qt 5 предполагает, что все строки по умолчанию имеют Unicode-кодировку, так что инициализация преобразователя кодировок текста происходит только при появлении первой не-Unicode строки. Хотя в Qt 5 значительно улучшилась производительность загрузки плагинов, они просто не могут загружаться ещё быстрее.

На скорости сказались также и другие улучшения, к примеру внедрение поддержки C++11 в Qt5 позволило создавать Unicode-строки, не требующие выделения памяти в куче.

В общем, попробуйте весёлого написания своих демонов на Qt и если у вас появятся какие-либо идеи по оптимизации кода — милости просим в Qt Codereview.

(*) Предупреждение: Количество инструкций не показывает, как быстр код, а только количество инструкций фактически обработанных процессором. Обратите внимание, что во всех случаях я измерил производительность только функции main(), не обращая внимания на издержки загрузки разделяемых библиотек, так что приложение может быть дополнительно оптимизировано при помощи предварительного связывания или прямым форком от уже работающего процесса.

От переводчика: если подобные небольшие переводы приживутся и я как переводчик в ваших глазах не полный мудак, то постараюсь продолжать переводить заметки из блога Qt Labs. Спасибо =)

Автор: vitaly_KF

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js