FastCode

редактировать

FastCode - это проект программирования с открытым исходным кодом, направленный на предоставление расширенных подпрограмм библиотеки времени выполнения для Embarcadero Delphi и C ++ Builder. С момента своего создания в 2003 году он внес в 32-разрядную библиотеку времени выполнения Delphi (RTL) высоко оптимизированную функциональность. FastCode является уникальным среди вкладов в коммерческие библиотеки времени выполнения компилятора из-за его управляемости сообществом и с открытым исходным кодом.

Содержание
  • 1 Структура
  • 2 Тестирование
    • 2.1 Проверка
    • 2.2 Бенчмаркинг
  • 3 Цели
  • 4 Список проблем
  • 5 Вклад в Delphi RTL
  • 6 FastCode Библиотека
  • 7 FastMM4 Memory Manager
  • 8 Приложения, использующие FastCode
  • 9 Ссылки
Структура

Проект организован в виде конкурса, разделенного на задачи. Каждая задача выполняет одну функцию и оптимизирует ее по ряду целей. Проект предоставляет инструменты для тестирования и проверки каждой функции. Одно очко дается за каждый вклад (максимум одна функция на цель дает очки) и десять очков присуждаются за целевого победителя. Список со всеми участниками и их оценками поддерживается, и в конце каждого года, до 2008 года, отмечался победитель. Borland, Codegear и Embarcadero, владельцы Delphi и C ++ Builder, исторически спонсировали призы.

Большинство участников конкурса - разработчики ассемблера, которые часто используют 32-битный код для конкретного процессора и дополнительные наборы инструкций, такие как MMX, SSE, SSE2, SSE3, SSSE3 и SSE4.

Проект пользуется поддержкой Embarcadero, который признает вклад команды FastCode и включает их код в кодовая база для Delphi. По умолчанию диспетчер памяти для Embarcadero Delphi, FastMM4, является победителем в конкурсе FastCode Memory Manager.

Проект сначала размещался на сайте Роберта Ли, и его Домашняя страница исходного кода - [1], последний раз обновлялась в 2008 году. Исходный код содержит как расширенные подпрограммы, так и наборы для тестирования этих подпрограмм. В 2017 году процедуры тестирования для Move, FillChar и диспетчера памяти были перенесены на 64-разрядную версию, доступную по адресу [2].

Testing

Проект FastCode прилагает много усилий для тестирования и основное внимание уделяется предоставлению программного обеспечения очень высокого качества. Тестирование делится на две категории - тестирование на правильность и тестирование на скорость.

Проверка

Проверка выполняется на всех ЦП из целевого набора и очень часто на других ЦП и ОС (Windows XP, Windows Vista, Windows 7 и т. Д.). Проверка выполняется по множеству различных входных функций, как в обычных, так и в случае ошибок. Проверка выполняется по известным правильным значениям и по эталонным реализациям, таким как существующие функции RTL.

Бенчмаркинг

Бенчмаркинг выполняется на всех ЦП, которые являются частью текущего целевого набора в данный момент времени. Эти процессоры были или являются частью целевых наборов: (Intel Pentium 3, Intel Pentium M, Intel Pentium 4, Intel Core, Intel Core 2, AMD Athlon XP, AMD Opteron, AMD Phenom ). Большое внимание было уделено тому, чтобы тесты были стабильными и реалистичными. В частности, было трудно получить справедливый тест задач диспетчера памяти, и журналы использования диспетчера памяти создавались при нормальном использовании реальных приложений, а затем воспроизводились тестом.

Цели

Тестирование выполнено на всем целевом наборе. Новый целевой набор определяется каждый год на основе опроса, в котором может проголосовать сообщество FastCode. Целевой набор обычно состоит из шести процессоров, из которых четыре от Intel и два от AMD. Это соотношение было выбрано для имитации рыночных долей. В дополнение к этим шести целевым объектам ЦП есть десять целей, определенных как смесь шести ЦП. Эти десять целей называются вычисленными целями и могут иметь только скорость или комбинацию скорости и размера. Максимально допустимый набор инструкций различен для каждой цели. Целью может быть «штраф размера IA32» или «SSE2». Штраф за размер определяется опросом для каждого испытания.

Список проблем

В проекте FastCode были выполнены следующие задачи [3] :

  • AES (Advanced Encryption Standard )
  • AnsiStringReplace (заменяет вхождения подстроки внутри строки.)
  • ArcCos (Вычисляет обратный косинус. Перегруженные версии для одинарной, двойной и расширенной точности.)
  • ArcSin (Вычисляет обратный синус. Перегруженные версии для одинарной, двойной и расширенной точности.)
  • Ceil32 (возвращает наибольшее почти 32-битное целое число.)
  • Ceil64 (возвращает наибольшее почти 64-битное целое число.)
  • CharPos (выполняет поиск первого вхождения Char в строке. Возвращает позицию этого вхождения.)
  • CharPosIEx (Поиск первого вхождения Char в строке без учета регистра, начиная с индекса, переданного как параметр. Возвращает позицию это вхождение.)
  • CharPosEy (Ищет n-е вхождение Char в строке, начиная с индекса, переданного в качестве параметра. Возвращает позицию этого s вхождения.)
  • CharPosRev (Ищет последнее вхождение Char в String. Он возвращает позицию этого вхождения.)
  • CompareMem (сравнивает два блока памяти.)
  • CompareStr (сравнивает две строки типа AnsiString.)
  • CompareText (сравнивает две strings.)
  • Fillchar (Заполняет часть буфера хранения одним и тем же байтом или символом FillValue FillCount раз.)
  • Floor32 (Возвращает наименьшее 32-битное целое число.)
  • Floor64 (возвращает наименьшее почти 64-битное целое число.)
  • GCD32 (32-битный наибольший общий делитель)
  • IDCT (обратное дискретное косинусное преобразование)
  • Int64Div ( Делит два 64-битных целых числа)
  • Int64Mul (умножает два 64-битных целых числа)
  • IntToStr (преобразует целое число в строку)
  • IsPrime (проверяет 32-битное целое число на простоту)
  • LowerCase (преобразует строку в нижний регистр)
  • MaxFP (возвращает максимум два значения с плавающей запятой Single, Double или Extended)
  • MaxInt (возвращает максимум два целочисленные значения)
  • MaxInt64 (возвращает максимум два 64-битных целых числа значений)
  • Диспетчер памяти
  • MinFP (возвращает минимум двух значений с плавающей запятой Single, Double или Extended)
  • MinInt (возвращает минимум двух целочисленных значений)
  • MinInt64 (возвращает минимум два 64-битных целых числа)
  • Move (копирует N байтов из источника в пункт назначения)
  • Сложение полярного комплексного числа
  • Полярный комплекс Вычитание чисел
  • Умножение полярных комплексных чисел
  • Деление полярных комплексных чисел
  • Преобразование полярного формата в прямоугольный
  • Pos (поиск первого вхождения подстроки в строка. Он возвращает позицию этого вхождения.)
  • PosEx (поиск первого вхождения подстроки в String, начиная с индекса, переданного в качестве параметра. Возвращает позицию этого вхождения.)
  • PosIEx (поиск без учета регистра для первого вхождения подстроки в String, начиная с индекса, переданного в качестве параметра. Возвращает позицию этого вхождения.)
  • Power (возвращает основание в степени)
  • Сложение прямоугольного комплексного числа
  • Вычитание прямоугольного комплексного числа
  • Умножение прямоугольного комплексного числа
  • Деление прямоугольного комплексного числа
  • Преобразование прямоугольного формата в полярный
  • RGBA в BGRA (преобразование формата растрового изображения)
  • Round (округление банкиров по одиночному, двойному или расширенному значению. Возвращает 64-битное целое число)
  • RoundToEx (округляет a, расширенная точность с плавающей точкой- значение в баллах до указанной цифры или степени десяти с использованием «банковского округления».)
  • Round32 (Банковское округление по одинарному, двойному или расширенному значению е. Возвращает 32-битное целое число)
  • Уменьшение масштаба (масштабирование растрового изображения)
  • Сортировка
  • StrComp (сравнивает две строки с завершающим нулем с учетом регистра)
  • StrCopy (Копирует одну строку с завершающим нулем в другую)
  • StrIComp (Сравнивает две строки с завершающим нулем без учета регистра)
  • StrLen (возвращает длину строки с завершающим нулем)
  • StrLComp (сравнивает две строки с завершающим нулем до длины, с учетом регистра)
  • StrLIComp (Сравнивает две строки с завершающим нулем до длины без учета регистра)
  • StrToInt32 ( Преобразует строку в 32-битное целое число)
  • Обрезать (Удаляет пробелы и управляющие символы из начала и конца строки)
  • TList.Sort
  • Trunc (Обрезает одиночный, Двойное или расширенное значение. Возвращает 64-битное целое число)
  • Trunc32 (усекает одиночное, двойное или расширенное значение. Возвращает 32-битное целое число)
  • UpperCase (преобразует строку в верхний регистр)
  • Val
Вклад в Delphi RTL

Включены функции FastCode в Delphi RTL:

  • Delphi 2005: CompareText, Int64Div и FillChar
  • Delphi 2006: CompareText, Int64Div и FillChar, диспетчер памяти FastMM4
  • Delphi 2007 — Delphi XE: ArcCos, ArcSin, Power, PosEx, Move, Memory Manager, FillChar, Pos, __lldiv, LowerCase, UpperCase, CompareStr, CompareMem, CompareText, StrLen, StrCopy, StrComp.

Книги Марко Канту по освоению Delphi содержат главу о FastCode, в которой перечислены вклады в Delphi RTL.

Библиотека FastCode

Все победители конкурса включены в библиотеку FastCode (http://fastcode.sourceforge.net/challenge_content/rtl_replcmnt_pkg.html ). Эта библиотека с открытым исходным кодом, выпущена под лицензией MPL. Библиотеку можно использовать двумя способами: 1) напрямую вызывать функции и 2) использовать исправления.

При прямом вызове функций разработчик приложения полностью решает вызвать версию функции, которую он считает наиболее быстрой.

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

Менеджер памяти FastMM4

Менеджер памяти FastMM, используемый Delphi и C ++ Builder с 2006 года, также стал победителем конкурса FastCode. Он заменил стандартный диспетчер памяти Delphi и не только менее подвержен фрагментации памяти, но и обеспечивает улучшенные возможности отладки, такие как возможность сообщать об утечках памяти при закрытии приложения, обнаруживать использование после освобождения памяти или двойные релизы.

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

FastMM4 часто указывается как обязательный инструмент для разработчиков Delphi.

Nexus DB поставляется с Интеграция FastMM4 для проверки утечек.

Использование FastMM описано в «Новый диспетчер памяти в BDS 2006».

Приложения, использующие FastCode

Приложение, разработанное в Delphi или C ++ Builder, будет обычно используйте диспетчер памяти по умолчанию - FastMM4. Функции FastCode в RTL были выбраны как наиболее часто используемые, и приложение также обычно будет использовать некоторые из них, особенно если выполняется какая-либо обработка строк. Поэтому большинство приложений Delphi / C ++ Builder будут использовать код, разработанный проектом FastCode. Некоторые примеры: Skype, FL Studio и собственная RAD Studio Embarcadero. Блог Холлварда описывает FastMM4 и почему он используется в качестве диспетчера памяти в приложении «Интернет-трейдер».

Ссылки
Последняя правка сделана 2021-05-20 11:27:11
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте