Из-за проблем с производительностью я хотел бы попытаться преобразовать функцию Freepascal (SHA1Update, из блока SHA1) в сборку. Я использую Freepascal 2.6.4 и Lazxarus 1.2.4.
Причина в том, что у меня есть структура цикла (повторяю … пока), которая читает 64 КБ блоков необработанных данных с диска в буфер, а затем хэшируется. Без хеширования я могу читать диск со скоростью 4Gb п \ мин. При хешировании он замедляется до чуть более 1 Гб / мин. Так кто-то предложил преобразовать процедуру хеширования в сборку.
Я программист ниже среднего, когда использую языки высокого уровня, не говоря уже о ассемблере, но потенциал для повышения производительности заставляет меня хотя бы задуматься.
Итак, мой вопрос: есть ли программа или сценарий, который может взять процедуру или функцию и волшебным образом преобразовать ее в сборку, которую я могу затем скомпилировать с помощью компилятора Freepascal? Я знаю, что это может быть сделано для C \ C ++, используя даже веб-систему, такую как этот
Сборка — это то, что вы бы использовали для оптимизации выбранных последовательностей кода. Но поскольку компиляторы собственного кода генерируют машинный код, обычно используя представление исходного кода промежуточной сборки, которое затем запускается через ассемблер, то преимущество, которое вы получаете от использования компилятора для «магического преобразования» вашего раздела кода, подлежащего оптимизации, в сборку который затем связывается с остальной частью программы, по сравнению с простой компиляцией всей программы с помощью компилятора, он равен нулю — в конце концов, вы используете тот же компилятор для преобразования. С этой точки зрения компилятор — не что иное, как такая программа, которая «волшебным образом преобразует его в сборку». В целях оптимизации вы хотите передать код этой части кода — и вам нужно уметь это делать. В настоящее время многие компиляторы генерируют код, который по разным причинам работает лучше, чем неопытный код. Одна из них заключается в том, что целевые ЦП сильно отличаются друг от друга тем, что является наиболее эффективным для них кодом, и правила определения того, как должен выглядеть эффективный код для конкретного ЦП, часто бывают чрезвычайно сложными. Как ручной кодировщик, вы должны знать различия между ними, уметь писать код, который работает хорошо. Это знание есть у многих компиляторов, и поэтому они могут генерировать код таким образом, чтобы та или иная архитектура или модель ЦП могли извлечь выгоду из различий, которые компилятор вносит в генерацию кода.
Часто гораздо лучший прирост производительности может быть достигнут путем выбора более эффективных алгоритмов. Лучший алгоритм, закодированный на высоком уровне, обычно превосходит менее адекватный алгоритм, закодированный вручную при сборке. Поэтому я хотел бы изучить возможности ускорения процесса хеширования, рассматривая альтернативные и более быстрые алгоритмы, а не пытаясь повысить скорость с помощью сборки на этом этапе — рассматривайте оптимизацию сборки как последний, последний шаг оптимизации, когда другие средства чтобы ускорить ваш код был исчерпан.
Как уже объяснял @Bushmills, ваш код автоматически преобразуется в сборку компилятором FreePascal — перед созданием машинного кода в формате Portable Executable (* .exe).
Вам нужен не язык ассемблера, а оптимизированный вручную код, написанный на ассемблере. Это задача для опытного программиста по сборке. Вы можете 1) стать экспертом по ассемблеру этот вопрос о переполнении стека может дать вам несколько отправных точек: Хороший учебник по NASM / FASM?
Я предполагаю, что любой программист может стать экспертом по ассемблеру (либо CISC или RISC архитектуры) примерно через год. В зависимости от вашего предыдущего опыта и курсов, которые вы должны пройти, и вашего рвения. Для теоретического фона (нейтральный процессор) я бы порекомендовал MMIX лекции Дональда Кнута
Ты должен быть способен 2) см. Промежуточные файлы сборки производится компилятором FreePascal с помощью следующих инструкций: http://free-pascal-general.1045716.n5.nabble.com/Assembler-file-generate-by-compiler-td5710837.html обсуждение
Если вы действительно хотите двигаться в разумные сроки, то я бы предложил вам создать Минимальный, полный и проверяемый пример а также 3) попросить пересмотреть код на некоторых сайтах проверки кода, где более опытные программисты будут смотреть на ваш код и предлагать некоторые изменения. Эти сайты должны быть хорошими кандидатами:
Это сайты, разработанные специально для помощи начинающим и средним программистам с такими проблемами, как ваша