Преобразовать функцию Freepascal в сборку?

Из-за проблем с производительностью я хотел бы попытаться преобразовать функцию Freepascal (SHA1Update, из модуля SHA1) в сборку. Я использую Freepascal 2.6.4 и Lazxarus 1.2.4.

Причина в том, что у меня есть структура цикла (повторять ... до тех пор, пока), которая считывает блоки необработанных данных размером 64 КБ с диска в буфер, а затем хеширует их. Без хеширования я могу читать диск со скоростью 4 Гб / мин. При хешировании скорость замедляется до чуть более 1 ГБ в минуту. Итак, кто-то предложил преобразовать процедуру хеширования в сборку.

Я программист ниже среднего при использовании языков высокого уровня, не говоря уже о ассемблере, но возможность улучшения производительности побуждает меня хотя бы узнать.

Итак, мой вопрос: есть ли программа или сценарий, который может взять процедуру или функцию и волшебным образом преобразовать ее в сборку, которую я затем могу скомпилировать с помощью компилятора Freepascal? Я знаю, что это можно сделать для C \ C ++, используя даже веб-систему, такую ​​как эту


person Gizmo_the_Great    schedule 04.07.2014    source источник
comment
Многие, если не большинство компиляторов машинного кода, переводят в промежуточное исходное представление сборки скомпилированного кода. Но тот факт, что они это делают, ничего не говорит о том, насколько эффективен этот сгенерированный код - что, вероятно, является сутью вашего вопроса. Просто быть представленным как промежуточный источник сборки не означает автоматически, что программа будет быстрее. быстрее чем что?   -  person Deleted User    schedule 04.07.2014
comment
Справедливый комментарий. К вопросу добавлены дополнительные детали.   -  person Gizmo_the_Great    schedule 04.07.2014
comment
Прежде чем пытаться преобразовать довольно большой и сложный фрагмент кода, чувствительного к безопасности, на язык ассемблера, я бы посоветовал вам изучить остальную часть вашей программы на предмет причины замедления. В частности, вам следует запустить профилировщик или, по крайней мере, самостоятельно определить время, чтобы увидеть, на что оно тратится. Вы говорите, что являетесь программистом ниже среднего, поэтому вполне вероятно, что есть вещи, которые вы можете сделать, чтобы ускорить свой собственный код, не запрыгивая ногой в глубокие колодцы языка ассемблера и криптографического кода.   -  person Jim Mischel    schedule 04.07.2014
comment
Если вы не специалист по сборке, очень мало шансов, что вы сможете создать код лучше, чем компилятор. Если вы можете выполнять асинхронный ввод-вывод, альтернативой будет двойная буферизация. Также имейте в виду, что если вы запускаете один инструмент за другим для одного и того же файла, второй может быть намного быстрее из-за кеша файловой системы.   -  person molbdnilo    schedule 04.07.2014
comment
Джентльмены, я уже запустил таймеры. Я даже попробовал код без таймеров, чтобы увидеть, не замедляют ли это таймеры! Вот откуда я знаю, что без хеширования он работает в 3 раза быстрее, считывая со скоростью 4 Гб в минуту вместо 1,22 Гб. И каждый тест проводился с выключенным ПК и аппаратным обеспечением между ними. Но да, справедливо по поводу сборки. Может, я был слишком самоуверен. Думаю, я его пропущу.   -  person Gizmo_the_Great    schedule 04.07.2014


Ответы (2)


Сборка - это действительно то, что вы бы использовали для оптимизации выбранных последовательностей кода. Но поскольку компиляторы машинного кода генерируют машинный код, обычно используя промежуточное исходное представление сборки, которое затем запускается через ассемблер, преимущество, которое вы получаете от использования компилятора для «волшебного преобразования» вашего раздела кода, подлежащего оптимизации, в сборку который затем связывается с остальной частью программы, по сравнению с простой компиляцией всей программы с помощью компилятора, примерно равен нулю - в конце концов, вы используете тот же компилятор для преобразования. С этой точки зрения компилятор - это не что иное, как такая программа, которая «волшебным образом преобразует ее в сборку». В целях оптимизации вы хотите передать этот фрагмент кода вручную - и вам нужно уметь это делать. Многие компиляторы в настоящее время генерируют код, который по разным причинам работает лучше, чем код, созданный неспециалистами. Один из них заключается в том, что целевые процессоры сильно различаются по тому, что для них лучше всего работает, и правила, определяющие, как должен выглядеть эффективный код для конкретного процессора, часто чрезвычайно сложны. Как ручной кодировщик, вы должны знать различия между ними, чтобы знать, как писать хорошо работающий код. Это знание есть у многих компиляторов, и поэтому они могут генерировать код так, чтобы та или иная архитектура или модель ЦП могли извлечь выгоду из различий, которые компилятор вносит в генерацию кода.

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

person Deleted User    schedule 04.07.2014
comment
Спасибо за полезное объяснение. Я уже исследовал другие библиотеки: DCPCrypt, SuperFastHash, XXHash, но с ними есть проблемы, поэтому я хочу придерживаться встроенного модуля Freepascal SHA1. И я также рассмотрел различные методы вызова CreateFile с различными флагами. Я также рассмотрел параметры компилятора, один или два из которых имеют значение. Таким образом, путь сборки был последним курсом действий, который нужно было предпринять, поэтому я надеюсь, что тот, кто отметил мой вопрос, не сделал этого, исходя из предположения, что я просто задал вопрос, не рассматривая сначала общую картину. - person Gizmo_the_Great; 04.07.2014
comment
Один из способов ускорить ваш код - ускорить дисковый ввод-вывод. Например, используйте отображение памяти файла / диска через CreateFileMapping() и MapViewOfFile(). Обычно это дает вам гораздо более быстрый доступ к данным, чем использование ReadFile() в буфере. Другой вариант - использовать рабочие потоки, перекрывающийся ввод-вывод или порт завершения ввода-вывода для подготовки дополнительных буферов данных в фоновом режиме, пока хеширование более раннего буфера занято, поэтому ваше хеширование не ожидает дискового ввода-вывода. Узнайте, как использовать параллельную обработку. - person Remy Lebeau; 04.07.2014

Как уже объяснил @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) попросите о проверке кода на некоторых сайтах проверки кода, где более опытные программисты взглянут на ваш код и предложат некоторые изменения. Эти сайты должны быть хорошими кандидатами:

Это сайты, разработанные специально для помощи начинающим и программистам среднего уровня в решении таких проблем, как ваша.

person xmojmr    schedule 04.07.2014