Как многие здесь говорят, компиляторы в наши дни делают довольно хорошую работу. Однако это не тот случай, когда они стали лучше людей - может быть, когда-нибудь (лучше, чем некоторые люди, да, ясно, но не «даже не пытайся, ты никогда их не побьешь»). Оптимизирующие компиляторы очень хорошо знают правила оптимизации, но очень плохо находят возможности их применять. Программист много знает о том, какие значения может иметь конкретная переменная в любой точке программы, но затем компилятор должен попытаться выяснить это снова из контекста. Абстрактная интерпретация проходит долгий путь, но она не совершенна и не может быть. Компиляторы также не очень хорошо умеют оптимизировать использование кэша. Они медленно достигают этого, но в настоящее время вам часто приходится делать код высокого уровня безобразным, чтобы получить правильный результат. Общеизвестно, что компиляторы плохо используют инструкции, которые не являются «базовой математикой», если они специально не проинструктированы делать это с помощью встроенных функций (которые по сути являются обманом - вы почти снова пишете сборку), а когда вы действительно используете встроенные функции, результирующий код часто не особенно хорошо и, кроме того, это не проще, чем писать в ассемблере напрямую (просто больше беспорядка от "подчеркивания, подчеркивания везде").
Так как же сборка быстрее? Ты знаешь все. Компилятор слепо следует правилам.
Конечно, все это предполагает, что вы действительно действительно знаете, как оптимизировать свою целевую платформу. Если вы собираетесь писать ассемблер «очевидным путем», вы, вероятно, не сможете победить правильный компилятор. То, сможете ли вы победить их, также во многом зависит от компилятора - ICC и LLVM довольно трудно победить, но на другом конце спектра вы можете победить .NET JIT-компилятор во сне (да, это JIT-компилятор , но так же и LLVM, если вы хотите, чтобы это было).
В случае, если вы хотите знать, как побить компиляторы ..
Прочитайте все здесь , несколько раз. Затем много попрактикуйтесь, продолжайте тестировать все и идите вразрез со своим любимым компилятором для всего релевантного (это будет тип «внутреннего цикла» - нет смысла оптимизировать код, который в любом случае не занимает значительную часть времени выполнения) , В конце концов вы будете последовательно побеждать его. Это не так сложно, как думают люди, это просто требует большой практики, и вы должны знать, как работает ваша целевая платформа наизусть (вам никогда не придется искать задержку или пропускную способность инструкции, ее порт выполнения и определенно не столько мопов, сколько он создает).