Список вопросов
Как зайти в Даркнет?!
25th January, 01:11
5
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
893
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
912
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
905
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4381
0
Помогите пожалуйста решить задачи
24th November, 23:53
6086
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4350
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4396
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Самый быстрый исполняемый код?
Просмотров: 407
 
Ответов: 7
Как вы думаете/знаете на каком в данный момент языке/компиляторе получается самый производительный код.
Зависит ли это от задач которые выполняет данный код.
Правда ли что современные компиляторы с++ оптимизируют код так, что он получается быстрее чем, если бы писать код на ассемблере.
Самый быстрый исполняемый код — это тот, который написан вменяемым программистом. Если у вас код выполняктся за O(nn), хотя есть алгоритм, делающий тоже самое за O(n), вам никакой компилятор не поможет.
А так неплохие результаты выдают компилер студии и GCC. Ну и Intel C++, хотя его надо твикать, чтобы получившийся бинарник не тупил на AMDшных процах.
Как-то вот так.
По поводу оптимизаций — компилятор знает про выравнивания, конвеер и ещё кучу разных вещей, которые даже за счёт в нужном месте воткнутого NOP ускорят код в несколько раз.
Процитирую Луговского:
Человек не умеет по настоящему эффективно писать на ассемблере.
В процессе компиляции высокоуровневых конструкций (даже всего лишь арифметических выражений) встречается несколько этапов, требующих либо применения большого числа хитрых эвристик, либо NP-сложного перебора, либо динамического программирования.
Особенно это относится к такой кривой платформе, как x86: регистров мало, у каждого — свои закидоны, плавучка x87 — вообще кошмар на улице Вязов — полустековая-полурегистровая машина с кучей труднообъяснимых условностей. Умный компилятор теоретически для любого относительно сложного алгоритма может выдать лучший код, чем это сделает человек. То, что не все компиляторы такие умные — это уже другой вопрос. Но в большинстве случаев более разумным будет написать специализированный компилятор чем писать на ассемблере непосредственно.
В процессе компиляции высокоуровневых конструкций (даже всего лишь арифметических выражений) встречается несколько этапов, требующих либо применения большого числа хитрых эвристик, либо NP-сложного перебора, либо динамического программирования.
Особенно это относится к такой кривой платформе, как x86: регистров мало, у каждого — свои закидоны, плавучка x87 — вообще кошмар на улице Вязов — полустековая-полурегистровая машина с кучей труднообъяснимых условностей. Умный компилятор теоретически для любого относительно сложного алгоритма может выдать лучший код, чем это сделает человек. То, что не все компиляторы такие умные — это уже другой вопрос. Но в большинстве случаев более разумным будет написать специализированный компилятор чем писать на ассемблере непосредственно.
Технически, самый быстрый код для конкретного CPU, можно написать в машинных кодах. Особенно, если учитывать ВСЕ аппаратные особенности конкретной машины на которой этот код выполняется. Однако, такой код в большинстве случаев не будет портируемым. Вообще на эту тему стоит прочитать книжку К.Касперского — «Техника оптимизации программ. Эффективное использование памяти».
Там есть и сравнительные тесты компиляторов.
Человек выдает более быстрый код. Компиляторы на самом деле ничего не знают о конвеерах и правильно делают — они сильно отличаются на разных процессорах, так что оптимизация под один ухудшит скорость на другом. Как раз вставка nop'ов это наглядно показывает. Функция может ускорится на 5-10%, так почему же компилятор не вставил этот nop?! Все что они делают — это выравнивают циклы. Эта работа легко автоматизируется макросами.
Когда говорят об NP-полноте оптимизации программы и возможности компилятора перебрать множество вариантов люди совершенно забывают о том, что человек и компьютер играют по разным правилам — человек не ограничен исходной программой и может делать оптимизации, которые компилятору запрещены (например, человек может знать, что те или иные указатели не являются алиасами при нормальной работе программы; перевернуть цикл, поскольку в спецификации указано, что порядок выдачи результатов не важен) или использовать конструкции, которых нет в языке программирования (одновременное деление и получение остатка, умножение 32-битных чисел с 64-битным результатом). И чем сложнее алгоритм, тем больше количество вариантов у человека по сравнению с компилятором.
Следует отметить, что зная как алгоритм лучше всего будет выглядеть на низком уровне, можно помочь компилятору, сделав запрещенные оптимизации за него. Обычно к этому еще добавляют оптимизации, до которых компилятор не догадывается или не считает нужным применить (стараясь сделать код меньше по размеру например). В результате в большом количестве случаев получается код сравнимый с ассемблером, только это заслуга отнюдь не компилятора.
Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться