Здраствуйте . На последнем семинаре по информатике в моём ВУЗе , наш семинарист сказал , что сейчас СИ намного быстрее ассемблера . Якобы ассемблер линеен , а если компилировать программу на с оптимизацией , то эта программа на си делает даже самую изящную прогу на asm . Действительно ли это так ? И если не так что дайте пожалуйста мне контр пример , лично я в это не верю . Ведь если есть такие возможности оптимизации на си , то и в ассемблере их уже наверное сделали . Спасибо за внимание . P.S. Извиняюсь заранее за новую созданную тему , просто не знаю кого можно ещё спросить . Просто я этого не понимаю , ассебмлер - это считай почти машинный код только словами . Программа на си в последствии тоже переводится в машинный код , как один код может работать быстрее другого , тем более один код считай ты сам делаешь , то есть в некоторых моментах ты можешь получить даже раз 10 более изящный код чем на СИ !
В ассемблере оптимизация делается вручную. Все именно так. Ваш семинарист дилетант. "Если руки-крюки и волосата грудь - то не будь профессором, грузчиком ты будь..." - это про него
основной его довыд был в том , что асма за один шаг делает одну команду ну допустим mov eax,ebx . То есть работает только с eax и ebx , в то время как си (с оптимизирующей компиляцией ) анализируя твой код при компиляции паралельно работает со всеми остальными устройствами и т.д. Он говорил именно только появилось на новых процессорах . Такое вообще возможно ? И как это реализовать на асме ? Посоветуйте что можно почитать(можно на англ.) про новые процессоры и их архитектуру и про программирование на fasm на них .
Melon такое возможно, только одновременным исполнением занимается не си, а процессор. Видимо, си просто расставляет инструкции ассемблера так, чтобы процессор мог выполнять их одновременно. Конечно, на асме ты руками тоже можешь такое делать, но это аналогично написанию программы сразу в машинных кодах - замучаешься просто. Компилятор си автоматом все оптимизирует, а тебе руками придется + надо помнить все правила выполнения комманд процессором. лучше забей на это дело - это сложно, неудобно (вряд ли код на асме будет более читабелен) и нафиг не надо даже на старых компах
Melon, и человек и компилер могут выдать код который использует все регистры (minimizes spill into ram) и перемешивает инстр-ции работы с ram и регистрами (что бы держать full pipeline) и уменьшает кол-во переходов и их логику (для улучшения branch prediciton) и т.д. Это только несколько примеров оптимизации. Всё зависит от качества компилера и опыта человека Раньше компилеры были примитивными, и такие оптимизации далались только руками. В современном компилере (в оптимизаторе) много всего реализовано, и большенству задач (и людей) просто не надо париться с асмом. В то же время, есть задачи где ручная оптимизация нужна, и знающий человек сделает её под конкретный силикон лучше чем компилер, но потеряет portability. Итог, нельзя сказать что ручной асм всегда быстрее или медленнее того что выплюнет компилер.
s0larian А можно писать такие проги на каком-нибудь fasm ? Или это только если на машинном коде ? И где можно почитать литературу про это?
Melon Компилятор оптимизирует быстрее чем человек. Написание программы на Си быстрее чем на ассемблере. Но качество оптимизации компилятора и человека различается. Человек выполняет оптимизацию гораздо лучше чем машина.Пример возьмем любую математическую библиотеку. Человек может оптимизировать как код на Си так и на Ассемблере. В целях переносимости и удобства восприятия пишут на Си. Для примера простая реализация БПФ уступает ручной оптимизации от интел или FFTW в 25 раз!!! Тоже самое относиться ко всем другим алгоритмам только скорость может отличаться. На ассемблере тоже можно криво написать. Он говорил про паролельность. Вопервых тут два основных аспекта. Это многоядерность и много поточная командная обработки. Что касается много поточная командной обработки. То тут ваш семинарист ошибается. Компилятор Си сам такую оптимизацию практически не делает нужно ручками написать. Примерно это выгляди так. Эти команды должны пойти в разные порты. В некоторых случаях компилятор может сделать так, но уж больно в редких и самых простых. Теперь что касается SIMD инструкций. Может вставить но не использует их по полной. Все математическии библиотеки исользуют либы ассемблерные вставки. Либы в коде на Си вставленны intrinsic. Но тут идет ручная оптимизация. Теперь что касается паралельности кода на многоядерных машинах. Вроде есть возможность дозволить компилятору самому решать как сделать распаролеливание. Хотя почему то использую OpenMP с прямым указанием в коде как делать. В основном вся оптимизация компилятора сводиться к распределению регистров и выравнивание кода и комманд. А вот вынос статического кода из цикла работает с переменным успехом. А это было сделанно давно. Остальная оптимизация не дает такого заметного эффекта. Потому что либы приносят незначительный прирос скорости либы приносит значительный, но в редких случаях. Можно ли обогнать компилятор? Да можно. Насколько это сложно? Зависит от компилятора. Но парочка простых приемов дает результат привосходящей компилятор в скоросте хотябы незначительно. Это все мое мнение.
всё можно и всё реально. FASM поддерживает почти все команды процессора. Если нужна реальная оптимизация, то без ассемблера не обойтись! просто основная проблема в том что большинство преподов в институтах знают только 16 битный ассемблер под DOS, а в реальном режиме большинство возможностей процессора недоступны. Вот спросишь у них что такое что такое регистр CR3 и механизм трансляции адресов, он ответит что не знает.