Страницы

Поиск по вопросам

вторник, 30 октября 2018 г.

Сравнение производительности штатных компиляторов Delphi, pascalABC.net и C++

В очередной раз очередной студент с горящими глазами объявил, что "всё, что у нас написано на Delphi - медленно и безобразно и, если мы уж не хотим перейти на C++, то почему бы не перейти на pascalABC.net, он быстрее значительно".
Студенту поручили проверить всё это. Конкретная задача (постараюсь определить в терминах скорости компиляторов, как мне указали в комментариях): сравнить производительность штатных компиляторов Delphi, PascalABC.net и MS VS (версий, которые у нас имеются. Не такие древние, хотя по академической лицензии иметь всегда последнее порой сложно). Выкладки, которые он привёл из сети, в целом не особо убедительны. Да, быстрее, но в конкретных примерах. Как они относятся к нашим задачам - не совсем ясно. Студенту поручили, в итоге, всё проверить на практике.
Вопрос, может, кто-то уже сталкивался с необходимостью сравнения скорости на больших биоинформатических проектах (или похожих: основной массив работы - строки, большое их количество, сравнение, точный и нечеткий поиск, построение деревьев, циклы, статистика) Delphi vs PascalABC.net и, возможно, C++?
Принцип подхода к снаряду понятен, объём работы - тоже. Но, мне, как куратору студента, хотелось бы понимать, насколько правильно он выполнил свою работу. Для этого неплохо было бы и сравнить его результаты с уже имеющимися, если таковые есть.


Ответ

Похоже, такие желания появляются у каждого третьего студента :) По крайней мере, у нас часто возникают схожие студенческие задачи, особенно, если приходят студенты с мехмата или ВИТ и желают заниматься только программированием. Ну, ладно, это лирика.
По делу. Сейчас у нас силами трёх студентов решается большая задача по оптимизации конвейера анализ->расшифровка->расчеты->моделирование->диагноз, в ней, в частности, большую часть занимают проблемы производительности наших пакетов, в том числе, созданных разными компиляторами. В списке компиляторов есть все три указанных вами, так что я могу в целом описать картину сравнения. Могу дать промежуточные выводы. Подробные данные могу опубликовать только с разрешения авторов (дипломная работа не окончена), если оно будет, я дополню ответ.
Сразу приведу класс задач в наших пакетах. Это работа с огромными и маленькими строками, матрицами (в меньшей степени), проблемы поиска, динамическое программирование, множества, ряды Фурье и вейвлеты, ввод-вывод. Время расчёта результата анализа одного пациента при работе в один поток может достигать 10-12 часов, так что погрешностями в долях секунды при замере времени работы можно пренебречь. В расчет принималось среднее от отношения времен работы. Для разных ситуаций количество замеров разное, но всегда больше 7.
Версии компиляторов: Delphi for Win64 31.0 (Delphi 10.1), PascalABC.net 3.2.0.1415, VS 2015 (14.00.24720)
Пакет на Delphi, написанный с использованием только стандартных методов и функций Delphi, в один поток, уступал по производительности и PascalABC.net и, тем более, C++. Разница в нашем основном пакете могла достигать, в зависимости от данных, 1.3 раза с паскалем и до 1.5х раз с C++ (есть разные результаты для разных процессоров, это самая большая разница). Так что, если не желаете заниматься профилировкой, а скорость работы критична, я бы не рекомендовал писать на Delphi. То же самое, но в многопоточном виде. Большинство наших задач успешно распараллеливаются, так что мы охотно применяем многопоточность. Разница Delphi супротив C++ в худшем случае осталась около 1.5х раз, с PascalABC.net - 1.1 раза. Скорее всего, в PascalABC.net многопоточность ещё плохо "вылизана". Многопоточная профилированная задача. В данном случае были выявлены "бутылочные горла" и проблемные места переписаны на ассемблере. Это было сделано для Delphi и C++. PascalABC.net не поддерживает встроенный ассемблер, были сделаны попытки подключения библиотек, но ожидаемого успеха пока не добились. Как итог, сравнение Delphi с C++ - отставание в 1.15 раза (на Intel), неоптимизированный пакет PascalABC.net проиграл Delphi в 1.6 раза То же самое, но с поддержкой SIMD. Вот тут уже почти паритет. Отставание Delphi от C++ на процессорах Intel - 1.06 раза (было бы интересно скомпилировать компилятором от Intel с интринсиками, но не знаю, будет ли реализовано или нет), на процессорах AMD - 1.01 раза. PascalABC не сравнивался - причина в п. 3
Была еще проведена оптимизация под конкретные ядра. Тут вообще интересные результаты (в частности, при оптимизации под ядра Zen на Ryzen 1700 в 16-типоточном приложении пакет на Delphi был повторяемо быстрее всех, что мы пока не можем внятно объяснить), но в промежуточном выводе они не представлены, без разрешения авторов я их дать не могу.

Комментариев нет:

Отправить комментарий