NanoDragon
@NanoDragon

Самый быстрый исполняемый код?

Как вы думаете/знаете на каком в данный момент языке/компиляторе получается самый производительный код.

Зависит ли это от задач которые выполняет данный код.

Правда ли что современные компиляторы с++ оптимизируют код так, что он получается быстрее чем, если бы писать код на ассемблере.
  • Вопрос задан
  • 4802 просмотра
Решения вопроса 1
kekekeks
@kekekeks
Самый быстрый исполняемый код — это тот, который написан вменяемым программистом. Если у вас код выполняктся за O(nn), хотя есть алгоритм, делающий тоже самое за O(n), вам никакой компилятор не поможет.

А так неплохие результаты выдают компилер студии и GCC. Ну и Intel C++, хотя его надо твикать, чтобы получившийся бинарник не тупил на AMDшных процах.

Как-то вот так.

По поводу оптимизаций — компилятор знает про выравнивания, конвеер и ещё кучу разных вещей, которые даже за счёт в нужном месте воткнутого NOP ускорят код в несколько раз.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 6
r3code
@r3code
Самый быстрый код — тот что не выполняется )
Ответ написан
Комментировать
@TimTowdy
Процитирую Луговского:
Человек не умеет по настоящему эффективно писать на ассемблере.

В процессе компиляции высокоуровневых конструкций (даже всего лишь арифметических выражений) встречается несколько этапов, требующих либо применения большого числа хитрых эвристик, либо NP-сложного перебора, либо динамического программирования.

Особенно это относится к такой кривой платформе, как x86: регистров мало, у каждого — свои закидоны, плавучка x87 — вообще кошмар на улице Вязов — полустековая-полурегистровая машина с кучей труднообъяснимых условностей. Умный компилятор теоретически для любого относительно сложного алгоритма может выдать лучший код, чем это сделает человек. То, что не все компиляторы такие умные — это уже другой вопрос. Но в большинстве случаев более разумным будет написать специализированный компилятор чем писать на ассемблере непосредственно.
Ответ написан
Комментировать
Teivaz
@Teivaz
Сомневаюсь, что компилятор С++ сможет сделать код лучше, чем код, написанный на ассемблере. Ведь подход ассемблер-программиста всегда уникален.
Ответ написан
pinebit
@pinebit
Freelance Software Engineer
Технически, самый быстрый код для конкретного CPU, можно написать в машинных кодах. Особенно, если учитывать ВСЕ аппаратные особенности конкретной машины на которой этот код выполняется. Однако, такой код в большинстве случаев не будет портируемым. Вообще на эту тему стоит прочитать книжку К.Касперского — «Техника оптимизации программ. Эффективное использование памяти».
Там есть и сравнительные тесты компиляторов.
Ответ написан
@halyavin
Человек выдает более быстрый код. Компиляторы на самом деле ничего не знают о конвеерах и правильно делают — они сильно отличаются на разных процессорах, так что оптимизация под один ухудшит скорость на другом. Как раз вставка nop'ов это наглядно показывает. Функция может ускорится на 5-10%, так почему же компилятор не вставил этот nop?! Все что они делают — это выравнивают циклы. Эта работа легко автоматизируется макросами.

Когда говорят об NP-полноте оптимизации программы и возможности компилятора перебрать множество вариантов люди совершенно забывают о том, что человек и компьютер играют по разным правилам — человек не ограничен исходной программой и может делать оптимизации, которые компилятору запрещены (например, человек может знать, что те или иные указатели не являются алиасами при нормальной работе программы; перевернуть цикл, поскольку в спецификации указано, что порядок выдачи результатов не важен) или использовать конструкции, которых нет в языке программирования (одновременное деление и получение остатка, умножение 32-битных чисел с 64-битным результатом). И чем сложнее алгоритм, тем больше количество вариантов у человека по сравнению с компилятором.

Следует отметить, что зная как алгоритм лучше всего будет выглядеть на низком уровне, можно помочь компилятору, сделав запрещенные оптимизации за него. Обычно к этому еще добавляют оптимизации, до которых компилятор не догадывается или не считает нужным применить (стараясь сделать код меньше по размеру например). В результате в большом количестве случаев получается код сравнимый с ассемблером, только это заслуга отнюдь не компилятора.
Ответ написан
Комментировать
Gorthauer87
@Gorthauer87
Программист
Самый быстрый код это тот, который выполняется на этапе компиляции.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы