Страницы

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


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

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

Скорость пузырьковой сортировки на Oberon, C++, Go, Rust


Воспользовавшись тестом на производительность с форума oberspace, реализованного для разных языков, проверил свой транслятор. Тест представляет собой написанную в лоб пузырьковую сортировку.

Одним из преимуществ использования транслятора Оберона перед непосредственным написанием кода на C/C++ является лёгкая возможность добавления проверок границ массива и использования неинициализированных переменных. Современные компиляторы Си тоже не так просты и позволяют добавлять некоторые проверки (-fsanitize), впрочем, рассматриваемые авторами только как отладочная возможность. Сравним эти возможности.

Время работы с проверками границ массива
Язык:С++ vector.atС++ vector[]GoOberonRust
Опции компилятора:clang++ -O3-O3 -fsanitize=addressgo buildo7c | clang -O3rustc -O -C lto
Время сек.:1.411.081.840.540.52

Транслятор Оберона вставляет проверки с помощью стандартного для Си assert, поэтому для их отключения достаточно объявить макрос NDEBUG при компиляции.

Время работы без проверок границ массива
Язык:С++ vector[]OberonRust
Опции компилятора:clang++ -O3o7c | clang -DNDEBUG -O3rustc -opt-level=3 -C lto
Время сек.:0.530.470.52

Результаты забавные - программа на Обероне оказалась в 2-а раза быстрей С++ и лишь слегка уступила самому быстрому варианту на Rust для сортировки с проверкой границ, и оказалась самой быстрой для сортировки без проверки. С учётом того, что Оберон транслируется в Си, то это, по сути, победа Си. С той поправкой, что написание защищённой программы сразу на Си потребует от программиста бОльших усилий за счёт явного прописывания проверок и неизбежного допущения какого-то количества дополнительных ошибок при этом процессе.

Тестовая среда
OS:GNU/Linux Ubuntu 16.04
CPU:Intel i3-4160 3.60GHz
clang:3.5
go:1.6.2
rustc:1.7.0