Как оптимизируется APL для обеспечения высокой производительности при обработке массивов?Какие примеры трюков и оптимизаций он выполняет? - PullRequest
2 голосов
/ 04 июля 2019

Меня интересует, насколько APL настолько эффективен в своих действиях, что иногда его сравнивают с показателями, превосходящими C. Поэтому мне интересно, каковы некоторые из оптимизаций, выполненных компилятором APL, чтобы сделать язык такимэффективный?

Ответы [ 2 ]

2 голосов
/ 04 июля 2019

Вот несколько примеров того, как это делается:

В связи с этим обсуждаются принципы, изложенные выше:

  • Выбор алгоритмов в зависимости от шаблонов данных, наблюдаемых во время выполнения, и того, как ленивый / прогремевший APL может полностью пропустить некоторый код: видео

  • Меньше задержки поиска путем чтения целых простых массивов ипредотвращение ошибок прогнозирования ветвлений с помощью кода без ветвей: video (APL соответствует этим идеям и поддерживает эти стили легче, чем многие другие языки)

1 голос
/ 04 июля 2019

Вы не можете сравнивать два языка (например, C и APL) как таковые с точки зрения производительности, поскольку производительность в значительной степени зависит от реализаций языков и используемых библиотек.Одна и та же программа на Си может быть медленной на одной платформе (читай: Windows) и быстрой на другой.Ключевым моментом является то, что производительность почти полностью является свойством данной реализации языка, а не свойством самого языка.

В случае APL можно разделить циклы ЦП, необходимые для данной операции, надве части: служебная информация интерпретатора (обработка токенов, составляющих программу APL) и примитивы (такие как сложение, уменьшение и т. д.).В большинстве интерпретаторов APL издержки интерпретатора довольно малы (это означает, что оптимизация в этой части не может получить большую производительность (иначе закон Амдала). В ранних APL (скажем, 1970) это было по-другому. Обработка примитивов APL в современных интерпретаторахреализован в C / C ++, так что часть циклов ЦП по производительности такая же, как и для C (опять же, имея в виду, что реализация может иметь значение).

Я провел несколько тестов на уровнеПримитивы APL (различные скалярные функции от простых (целочисленное сложение) до не очень простых (сложный arcus cosinus) и для их внешних произведений. Несколько неожиданный результат состоял в том, что производительность различных скалярных функций не определялась сложностью вычисляемой функциино по времени доступа к / из памяти (включая кеши) и по прогнозированию ветвления ЦП. Например, если вы выполняете ту же операцию APL в цикле, то вторая итерация обычно будет дваждыБыстро, как первая и последующая итерация стабилизировалась примерно после четвертой итерации (на процессоре i5-4570).

Измеренные значения сильно колебались, что делает старомодные показатели производительности (например, интерпретатор X).в два раза быстрее, чем интерпретатор Y), довольно бессмысленно.

Как правило, если средний векторный размер (т. е. X, X) вашей программы APL равен 20 или более, вы можете полностью игнорировать интерпретаторнакладные расходы, и программа APL имеет примерно такую ​​же производительность, что и сопоставимая программа на языке C.

Случаи, когда APL быстрее, чем C (что невозможно в теории), часто можно отнести к использованию различных алгоритмов на Cи в APL.Типичным примером из реальной жизни является сортировка с использованием heapsort в одном случае и с быстрой сортировкой в ​​другом.Это опять-таки разница в реализациях, а не разница самих языков.

...