Продолжаю тестировать транслятор Оберона из проекта "Восток". На сей раз мой взор пал на производительность при использовании объектно ориентированного подхода. Ранее я уже проводил сравнение для Си, Objective-C, C++ на примере сортировки вставками. Недостатком того воплощения было то, что в нём испытывался только вызов виртуального метода, а безопасного приведения от общего типа к расширенному не было. Для Си это требовало написания большего количества текста, чем нужно, поэтому и для остальных языков оно было исключено. Теперь, когда у меня есть транслятор Оберона в Си, эту возможность задействовать куда проще, поэтому я соответствующим образом подправил тест, также заменив Си на Оберон.
Результаты интересные, судите сами.
Показатели для С++ и Objective-C и Go поделены на соответствующие показатели для ОберонаЯзык | С++ | Objective-C | Go |
Время работы | 4,34 | 3,93 | 3,24 |
Размер исходников | 0,85 | 1,07 | 0,56 |
Размер исполнимого файла | 1 | 1,16 | 153 |
Не так смешно, что код на С++, в котором реализовано множественное наследование, уступил по скорости Оберону, в котором запись может быть расширена от единственной базовой, как то, что С++ оказался даже медленней обычно более тормозного Objective-C, чьё ООП построено на более мудрёном механизме посылки сообщений. Справедливости ради надо отметить, что такого результата удалось добиться вынесением получения класса от приводимого типа за цикл, что в обычном случае не делается. То есть, вместо
assert([ia isKindOfClass:[IntPoint class]]);
использовалось
assert([ia isKindOfClass:IntPointClass]);
где IntPointClass
- это глобальная переменная, инициализированная значением [IntPoint class]
.
Без этого программа работала в 3 раза медленней.
Так как меня интересовала только скорость ООП, то остальные проверки были отключены для всех языков, кроме Go, для которого я не знаю простого способа сделать это. Тем не менее, Go показал лучший после Оберона результат. Для сборки Go использовался go version 1.6.2, для трансляции остальных языков использовался gcc version 5.4
с ключами оптимизации -O3 -flto
.
Полный код теста, как всегда, доступен на github.
Обновление: проверил тест на Orange Pi PC+ - одноплатном миникомпьютере. На нём стоит Debian Jessie от Armbian c более старыми версиями компиляторов, что вкупе с другой архитектурой процессора повлияло на результаты, но лидер остался прежним:
Язык С++ Objective-C Go
Время работы 3,24 4,56 4,7
Размер исходников 0,85 1,07 0,56
Размер исполнимого файла 0,99 2,42 176
Компиляторы: gcc 4.9.2, go 1.3.3.
2-е обновление: сумел поставить на Orange Pi PC+ Ubuntu 16.04 - идентичную версию того, что стоит на основном компьютере, поэтому и версии компиляторов на них совпадают - gcc 5.4 и go 1.6.1.
Язык С++ Objective-C Go
Время работы 3,13 3,52 3
Размер исходников 0,85 1,07 0,56
Размер исполнимого файла 1,02 2,11 201
Ничо так. Камрад, а Оберон? Может есть смысл рискнуть транслятор в Go нарисовать?)
ОтветитьУдалитьОберон в знаменателе для получения нормализованных значений.
УдалитьЕсть желание добавить в качестве целевой платформы и Go, но пока не до него.
Ждём, дорогой ты наш товарищ!))
Удалить