Сведения о вопросе

Holish

00:07, 25th August, 2020

Теги

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

Просмотров: 407   Ответов: 7

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

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

Правда ли что современные компиляторы с++ оптимизируют код так, что он получается быстрее чем, если бы писать код на ассемблере.



  Сведения об ответе

DINO

07:14, 21st August, 2020

Самый быстрый исполняемый код — это тот, который написан вменяемым программистом. Если у вас код выполняктся за O(nn), хотя есть алгоритм, делающий тоже самое за O(n), вам никакой компилятор не поможет.

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

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

По поводу оптимизаций — компилятор знает про выравнивания, конвеер и ещё кучу разных вещей, которые даже за счёт в нужном месте воткнутого NOP ускорят код в несколько раз.


  Сведения об ответе

lourence

00:36, 2nd August, 2020

Самый быстрый код — тот что не выполняется )


  Сведения об ответе

ASER

04:48, 17th August, 2020

Процитирую Луговского:
Человек не умеет по настоящему эффективно писать на ассемблере.

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

Особенно это относится к такой кривой платформе, как x86: регистров мало, у каждого — свои закидоны, плавучка x87 — вообще кошмар на улице Вязов — полустековая-полурегистровая машина с кучей труднообъяснимых условностей. Умный компилятор теоретически для любого относительно сложного алгоритма может выдать лучший код, чем это сделает человек. То, что не все компиляторы такие умные — это уже другой вопрос. Но в большинстве случаев более разумным будет написать специализированный компилятор чем писать на ассемблере непосредственно.


  Сведения об ответе

lourence

11:53, 1st August, 2020

Сомневаюсь, что компилятор С++ сможет сделать код лучше, чем код, написанный на ассемблере. Ведь подход ассемблер-программиста всегда уникален.


  Сведения об ответе

qwerty101

05:05, 16th August, 2020

Технически, самый быстрый код для конкретного CPU, можно написать в машинных кодах. Особенно, если учитывать ВСЕ аппаратные особенности конкретной машины на которой этот код выполняется. Однако, такой код в большинстве случаев не будет портируемым. Вообще на эту тему стоит прочитать книжку К.Касперского — «Техника оптимизации программ. Эффективное использование памяти».
Там есть и сравнительные тесты компиляторов.


  Сведения об ответе

davran

08:57, 14th August, 2020

Человек выдает более быстрый код. Компиляторы на самом деле ничего не знают о конвеерах и правильно делают — они сильно отличаются на разных процессорах, так что оптимизация под один ухудшит скорость на другом. Как раз вставка nop'ов это наглядно показывает. Функция может ускорится на 5-10%, так почему же компилятор не вставил этот nop?! Все что они делают — это выравнивают циклы. Эта работа легко автоматизируется макросами.

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

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


  Сведения об ответе

SKY

04:36, 29th August, 2020

Самый быстрый код это тот, который выполняется на этапе компиляции.


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться