"здесь задета моя честь"
От: кт  
Дата: 23.12.17 11:14
Оценка: 5 (3) :))
«Вы доверили мне сад – в него упал человек.
Здесь задета моя честь!»
Садовник Антонио
Бомарше «Женитьба Фигаро»

24 сентября 2017 года широко известный в узких кругах Джон Уолкер (John Walker) для своего любимого «геометрического теста» https://www.fourmilab.ch/fbench/
добавил очередной язык https://www.fourmilab.ch/fourmilog/archives/2017-09/001713.html

Это событие не стоило бы упоминания, если бы, не два обстоятельства:
Во-первых, этот язык – используемый мною PL/1.
Во-вторых, и это главное, он показал по сравнению с другими языками просто позорный результат. И я, подобно садовнику Антонио, почувствовал, себя задетым.
Как же так? Ну ладно, не получится соревноваться с каким-нибудь Parallel Chapel с его 64 процессами, но проиграть какому-то там Питону или (прости, г-ди) Эрлангу?
Не может быть!
Оттранслировал тест используемым транслятором (под Win64) и получил, конечно, совсем другой результат. После чего решил разобраться, чего не так у автора, который использовал транслятор Iron Spring PL/I 0.9.9b beta, Linux.
При этом сам Уолкер, питая теплые чувства к PL/1, пытался разобраться, почему счет идет так медленно, справедливо указав, что в PL/1 нет объективных ограничений эффективности.
Действительно Iron Spring оказался скорее «дубоватым», чем «железным».

Во-первых, у него не оказалось встроенного арксинуса. А PL/1 без арксинуса, все равно, что Д’Артаньян без шпаги. Ну ладно, ладно, не Д’Артаньян. Как Портос без бантика в волосах. У нормального PL/1 арксинусов девать некуда. Есть для float/double, для радиан/градусов и для комплексных/действительных чисел.

Во-вторых, Уолкер обнаружил, что безобидное выражение X**2 умудряется выполняться экспонентой, а не умножением. Это действительно странно. Если степень целая – она, естественно, автоматически приводится к умножению во всех нормальных трансляторах.
Правда, и сам Уолкер не заметил, что в 264 строке вместо float binary стоит fixed decimal, говоря словами поэта: «неизвестно зачем, непонятно на кой». Эта описка включает совершенно ненужное в данном тесте преобразование типов.

Есть и еще одна тонкость. Разработчики Iron Spring добавили к оператору INITIAL новый оператор инициализации VALUE, которого нет в стандарте языка. Все его описание составляет одну строку: «Compiler implements VALUE attribute to define named constants». Но тут вот какой нюанс: при инициализации важен класс памяти переменных. В исходном тексте теста класс памяти вообще нигде не указан, а тогда по умолчанию будет AUTOMATIC, т.е. память, выделяемая динамически при входе в блок. Получается, что Уолкер везде формально заказал выполнение инициализации каждый раз при входе в подпрограммы. Если заказать переменные с классом памяти STATIC – их инициализация выполнится один раз при компиляции. В этом смысле мне нравится используемый транслятор. У него не сделана автоматическая генерация инициации, а просто проверяется, что если есть INITIAL, то должен быть STATIC, иначе пошел вон. Действительно, если я хочу каждый раз новой инициации – нужно просто написать явные операторы присваивания, а не доверять это компилятору, который навставляет их, где ни попадя.

Таким образом, оттранслировав тест Уолкера нормальным транслятором PL/1, я получил и нормальный же результат. Не скажу какой, поскольку какие бы цифры я не назвал, обязательно найдется кто-нибудь, кто заявит, что у него не так.
Поэтому я даю ссылку на оттранслированный модуль на PL/1: http://files.rsdn.org/122727/FBENCH.EXE
Ссылка на исходный текст http://files.rsdn.org/122727/FBENCH.txt
В тексте заменил все VALUE на STATIC INIT, убрал самодельный арксинус. Чуть увеличил число итераций. Уолкер почему-то написал, что для PL/1 поставил 29592068 циклов, хотя по смыслу задачи их должно быть 5753х5753=33097009.
Я понимаю, что предложение запустить неизвестную EXE-шку, на том основании, что автор мамой клянется, что в ней нет зловреда, это как-то не смотрится.
Поэтому вот ссылка на текст теста вместе со скомпилированными кодами.
http://files.rsdn.org/122727/fbench1.txt
Легко убедиться, что со стартового адреса 401200 выполняются именно эти коды, а не какие-то другие.
Тест хорош тем, что это реальная задача, вылизанная автором за много лет. Так что, если кто-то захочет проверить эффективность используемых им средств и на тесте Уолкера, он может еще и сравнить свои результаты с PL/1. Ну и порадоваться (или огорчиться).
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.