Страницы

понедельник, 14 ноября 2016 г.

Скорость ООП сортировки вставками на Oberon, Objective-C, C++, Go

Продолжаю тестировать транслятор Оберона из проекта "Восток". На сей раз мой взор пал на производительность при использовании объектно ориентированного подхода. Ранее я уже проводил сравнение для Си, Objective-C, C++ на примере сортировки вставками. Недостатком того воплощения было то, что в нём испытывался только вызов виртуального метода, а безопасного приведения от общего типа к расширенному не было. Для Си это требовало написания большего количества текста, чем нужно, поэтому и для остальных языков оно было исключено. Теперь, когда у меня есть транслятор Оберона в Си, эту возможность задействовать куда проще, поэтому я соответствующим образом подправил тест, также заменив Си на Оберон.

Результаты интересные, судите сами.

Показатели для С++ и Objective-C и Go поделены на соответствующие показатели для Оберона
ЯзыкС++Objective-CGo
Время работы4,343,933,24
Размер исходников0,851,070,56
Размер исполнимого файла11,16153

Не так смешно, что код на С++, в котором реализовано множественное наследование, уступил по скорости Оберону, в котором запись может быть расширена от единственной базовой, как то, что С++ оказался даже медленней обычно более тормозного 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 более старыми версиями компиляторов, что вкупе с другой архитектурой процессора перевернуло места за исключением нетронутого лидера на Oberon:

Язык С++ Objective-CGo
Время работы 3,244,56 4,7
Размер исходников 0,851,07 0,56
Размер исполнимого файла0,992,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-CGo
Время работы 3,133,52 3
Размер исходников 0,851,07 0,56
Размер исполнимого файла1,022,11 201

3 комментария:

  1. Ничо так. Камрад, а Оберон? Может есть смысл рискнуть транслятор в Go нарисовать?)

    ОтветитьУдалить
    Ответы
    1. Оберон в знаменателе для получения нормализованных значений.
      Есть желание добавить в качестве целевой платформы и Go, но пока не до него.

      Удалить
    2. Ждём, дорогой ты наш товарищ!))

      Удалить

Обработка ошибок

Тема корректной обработки ошибок в программе является довольно сложным вопросом в программировании. Отчасти от того, что и она сама являет...