Получил в использование одноплатный компьютер StarFive VisionFive c 2-ядерным процессором на архитектуре RISC-V. На поставляемом с платой дистрибутиве Fedora провёл тестирование транслятора Восток и, в частности, проверку времени исполнения сгенерированного кода с проверками корректности и без.
Замечу, что с пользовательской точки зрения, плата с поставляемым дистрибутивом Fedora, крайне неудобоварима - нестабильна и неповоротлива. Удобней использовать в качестве небольшого сервера.
Были протестированы проверки, генерируемые транслятором Восток, и генерируемые компилятором gcc при выключенной генерации проверок из Oberon в C. На RISC-V доступны только те, что включаются -fsanitize=undefined. В проверки на уровне Oberon входят проверки индекса массива, переполнения диапазонов, инициализированности переменных, обращения по NIL и пользовательских утверждений. Компиляция из C была проведена без профилирования из-за недоступности. В качестве модельного кода служит сам транслятор.
Размер, байт | отношение | Время, секунд | отношение | |
---|---|---|---|---|
Без проверок | 299 624 | 1 | 4,82 | 1 |
Проверки Oberon | 320 160 | 1,35 | 5,33 | 1,11 |
san. undefined | 512 584 | 1,71 | 6,47 | 1,34 |
Стоит отметить низкие относительные накладные расходы на проверки. Эта особенность представляет большой интерес, потому что RISC-V, например, не использует флаги для выявления целочисленного переполнения в пользу явных проверок Тем не менее, совокупно в проверках он не только не отстаёт, но даже опережает другие архитектуры, что для многих, не знакомых с задумкой, является контринтуитивным.
Доступный для этой же платы серверный образ Ubuntu позволяет задействовать профилировщик и проверить больше вариантов запуска, но даже самый эффективный из них значительно уступает тому варианту без профилирования, что есть на дистрибутиве от разработчика платы.
Размер, байт | отношение | Время, секунд | отношение | |
---|---|---|---|---|
gcc, Без проверок | 297 168 | 1 | 5,53 | 1 |
gcc, Проверки Oberon | 313 560 | 1,06 | 6,27 | 1,13 |
gcc, san. undefined | 481 472 | 1,62 | 7,31 | 1,32 |
gcc, san. address | 2 111 504 | 7,11 | 11,49 | 2,08 |
gcc, san. u. + a. | 2 344 968 | 7,89 | 16,81 | 3,04 |
clang, Без проверок | 261 000 | 0,88 | 6,39 | 1,16 |
clang, Проверки Oberon | 298 064 | 1,003 | 7,66 | 1,39 |
clang, san. undefined | 269 192 | 0,91 | 7,11 | 1,29 |
Java | 374,4 | 67,7 |
Заодно провёл тестирование на ряде других доступных мне архитектурах, начиная с Raspberry Pi 400 c 4-ядерным процессором. Для компиляции через С было включено профилирование.
Размер, байт | отношение | Время, секунд | отношение | |
---|---|---|---|---|
C, Без проверок | 354 216 | 1 | 1,83 | 1 |
C, Проверки Oberon | 386 992 | 1,09 | 2,06 | 1,13 |
C, san. undefined | 657 320 | 1,86 | 2,27 | 1,24 |
C, san. address | 2 275 480 | 6,42 | 6,07 | 3,32 |
C, san. u.+a. | 2 541 624 | 7,18 | 6,58 | 3,60 |
Java | 24,56 | 13,42 | ||
JavaScript | 81,76 | 44,68 |
Тестирование на 8-ядерном Эльбрусе без профилирования
Размер, байт | отношение | Время, секунд | отношение | |
---|---|---|---|---|
lcc, Без проверок | 908 168 | 1 | 2,55 | 1 |
lcc, Проверки Oberon | 1 522 728 | 1,68 | 4,16 | 1,63 |
lcc, san. address | 7 654 808 | 8,43 | 8,56 | 3,36 |
clang, Без проверок | 2 527 576 | 2,78 | 2,29 | 0,9 |
clang, Проверки Oberon | 2 327 024 | 2,56 | 2,96 | 1,16 |
Java | 47,9 | 13,8 | ||
JS со всеми проверками | 1054,2 | 303,8 | ||
JS без границ массивов | 863,9 | 248,96 | ||
JS и без арифметики | 789,2 | 227,44 |
Бросается в глаза большой размер исполняемых файлов, особенно для clang, но что ещё интересней для этого компилятора, так это аномальное уменьшение размера при добавлении проверок Oberon. Жаль, что этот трюк не удался с временем исполнения. Проверки Оберона оказались самыми дорогими среди всех остальных платформ — в лучшем случае +30% ко времени. Если взглянуть на код сложения с контролем переполнения, то становится приблизительно понятно почему, хотя это и не повод для далекоидущих выводов.
(Editor+%231)',t:'0')),k:58.1542699724518,l:'4',n:'0',o:'',s:0,t:'0')),l:'2',n:'0',o:'',t:'0')),version:4Для исполнения через Java нет какого-либо провала по сравнению с другими архитектурами, что для широкого командного слова достижимо не так-то и просто. А вот по времени работы через JavaScript в node можно предположить, что этот скриптовый язык выполняется через пошаговую интерпретацию, что обусловило существенную разницу между кодом с проверками и без. Для других архитектур разница невелика, поэтому и не приводилась в таблице. В отличии от node у движка JavaScript в Firefox хорошая производительность, но benchmark не рассчитан на работу в браузере.
В режиме 128-битных указателей, при которых Эльбрус предоставляет дополнительную аппаратную защиту от повреждения буферов и использования неинициализированных переменных, полноценно запустить benchmark не удалось, потому что длинные вычисления обрываютcя прерыванием. Просто собранный транслятор работает как положено, поэтому можно сравнить его время работы в 128-битном режиме с отключёнными пересекающимися проверками от Oberon и в 64-битном режиме с включёнными.
Время, сек. | |
---|---|
128 bit | 0,86 |
64 bit | 0,55 |
Тестирование на обычном ПК с включённым профилированием. Добавлены замеры при компиляции через простой неоптимизирующий Tiny C Compiler.
Размер, байт | отношение | Время, секунд | отношение | |
---|---|---|---|---|
gcc, Без проверок | 379 096 | 1 | 0,44 | 1 |
gcc, Проверки Oberon | 424 160 | 1,12 | 0,52 | 1,18 |
gcc, san. undefined | 637 144 | 1,68 | 0,57 | 1,30 |
gcc, san. address | 2 386 032 | 6,29 | 0,77 | 1,75 |
gcc, san. u.+a. | 2 684 912 | 7,08 | 0,95 | 2,16 |
clang, Без проверок | 489 776 | 1,29 | 0,45 | 1,02 |
clang, Проверки Oberon | 387 360 | 1,02 | 0,51 | 1,16 |
clang, san. undefined | 567 576 | 1,5 | 0,53 | 1,20 |
clang, san. address | 2 475 544 | 6,53 | 0,81 | 1,84 |
clang, san. u.+a. | 2 487 896 | 6,56 | 0,92 | 2,09 |
tcc, Без проверок | 472 056 | 1,25 | 1,07 | 2,43 |
tcc, Проверки Oberon | 607 984 | 1,6 | 3,84 | 8,73 |
Java | 4,50 | 10,23 | ||
JavaScript | 15,36 | 34,91 |
Тестирование на смартфоне Samsung Galaxy S20 FE из Termux через clang. Профилирование было выключено, потому что эффективность кода после него оказалась в 2-а раза ниже непрофилированного.
Размер, байт | отношение | Время, секунд | отношение | |
---|---|---|---|---|
Без проверок | 401 280 | 1 | 0,63 | 1 |
Проверки Oberon | 379 640 | 0,95 | 0,69 | 1,10 |
san. undefined | 454 480 | 1,13 | 0,69 | 1,10 |
san. address | 1 115 240 | 2,78 | 1,21 | 1,92 |
san. u.+a. | 986 840 | 2,46 | 1,29 | 2,05 |
Java | 8,47 | 13,44 | ||
JavaScript | 23,44 | 37,21 |
Помимо проваленного профилирования, clang продолжил чехарду с размером исполняемого файла. Производительность кода в разы выше чем на Pi, и даже забавно, что смартфон всего лишь на треть отстал от ПК. Смартфоны уже давно технически готовы к работе в качестве легковесных ПК, но не используются так из-за отстутствия соответствующей воли. Тот же режим DEX, доступный на премиальных Samsung — это лишь бедный родственник основной потребительской системы.
Заключение
- Компиляторные проверки C доступны не везде, не всегда, и задействовать их бывает непросто. С проверками от Oberon не возникло никаких проблем и не потребовало правок.
- Проверки на уровне Oberon оказываются во всех смыслах дешевле проверок уровня C на всех протестированных платформах, несмотря на то, что проверки C составляются на уровне компилятора и покрывают меньше случаев, чем проверки корректности Oberon, существущие на правах обычного кода. Эффективность достижима благодаря:
- Особенностям Оберона, более располагающим к возможностям проверок.
- Cпецифическим решениям транслятора Восток.
- Высокооптимизирующим компиляторам С, позволяющим генерировать эффективный код проверок, не имея специальных знаний о них.
- Аппаратные проверки тоже имеют свою цену, и на Эльбрусе, единственной платформе, на которой они доступны, аппаратные проверки обходятся даже дороже программных, которые на нём и так оказались самыми дорогими в сравнении с другими платформами.
- Проверки имеют вполне приемлемую цену для того, чтобы во многих случаях их никогда не отключать даже при компиляции исходного кода на C, не говоря уже про Oberon.
Комментариев нет:
Отправить комментарий