FastCode - Википедия - FastCode

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

Структура

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

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

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

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

Тестирование

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

Проверка

Проверка выполняется на всех ЦП из целевого набора и очень часто на других ЦП и ОС (Windows XP, Виндоус виста, 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 (Расширенный стандарт шифрования )
  • AnsiStringReplace (заменяет вхождения подстроки в строке.)
  • ArcCos (Вычисляет обратный косинус. Перегруженные версии для одинарной, двойной и повышенной точности.)
  • ArcSin (Рассчитывает обратный синус. Перегруженные версии для одинарной, двойной и повышенной точности.)
  • Ceil32 (возвращает наибольшее почти 32-битное целое число.)
  • Ceil64 (возвращает наибольшее почти 64-битное целое число.)
  • CharPos (ищет первое вхождение Char в строке. Возвращает позицию этого вхождения.)
  • CharPosIEx (поиск без учета регистра первого вхождения Char в строке, начиная с индекса, переданного в качестве параметра. Возвращает позицию этого вхождения.)
  • CharPosEy (ищет n-е вхождение Char в строке, начиная с индекса, переданного в качестве параметра. Возвращает позицию этого вхождения.)
  • CharPosRev (ищет последнее вхождение Char в строке. Возвращает позицию этого вхождения.)
  • CompareMem (сравнивает два блока памяти.)
  • CompareStr (сравнивает две строки типа AnsiString.)
  • CompareText (сравнивает две строки.)
  • Fillchar (заполняет раздел буфера хранения одним и тем же байтом или символом FillValue FillCount раз.)
  • Floor32 (возвращает наименьшее 32-битное целое число.)
  • Floor64 (возвращает наименьшее почти 64-битное целое число.)
  • GCD32 (наибольший общий делитель 32 бита)
  • IDCT (обратное дискретное косинусное преобразование)
  • Int64Div (делит два 64-битных целых числа)
  • Int64Mul (умножает два 64-битных целых числа)
  • IntToStr (преобразует целое число в строку)
  • IsPrime (проверяет простоту 32-битного целого числа)
  • Нижний регистр (преобразует строку в нижний регистр)
  • MaxFP (возвращает максимум два значения с плавающей запятой Single, Double или Extended)
  • MaxInt (возвращает максимум два целых значения)
  • MaxInt64 (возвращает максимум два 64-битных целых числа)
  • Менеджер памяти
  • MinFP (возвращает минимум два значения с плавающей запятой Single, Double или Extended)
  • MinInt (возвращает минимум два целых значения)
  • MinInt64 (возвращает минимум два 64-битных целых числа)
  • Переместить (копирует N байтов из источника в место назначения)
  • Сложение полярных комплексных чисел
  • Вычитание полярного комплексного числа
  • Умножение полярных комплексных чисел
  • Деление полярных комплексных чисел
  • Преобразование полярного формата в прямоугольный
  • Pos (Ищет первое вхождение подстроки в String. Возвращает позицию этого вхождения.)
  • PosEx (поиск первого вхождения подстроки в String, начиная с индекса, переданного в качестве параметра. Возвращает позицию этого вхождения.)
  • PosIEx (поиск без учета регистра первого вхождения подстроки в String, начиная с индекса, переданного в качестве параметра. Возвращает позицию этого вхождения.)
  • Степень (возвращает основание в степени)
  • Сложение прямоугольных комплексных чисел
  • Вычитание прямоугольного комплексного числа
  • Умножение прямоугольных комплексных чисел
  • Прямоугольное деление комплексных чисел
  • Преобразование прямоугольного формата в полярный
  • RGBA в BGRA (преобразование формата растрового изображения)
  • Round (Банковское округление по одиночному, двойному или расширенному значению. Возвращает 64-битное целое число)
  • RoundToEx (округляет значение с плавающей запятой повышенной точности до указанной цифры или до десяти, используя «банковское округление».)
  • Round32 (Банковское округление по одиночному, двойному или расширенному значению. Возвращает 32-битное целое число)
  • Уменьшение масштаба (масштабирование растрового изображения)
  • Сортировать
  • StrComp (сравнивает две строки с завершающим нулем, с учетом регистра)
  • StrCopy (копирует одну строку с завершающим нулем в другую)
  • StrIComp (сравнивает две строки с завершающим нулем, без учета регистра)
  • StrLen (возвращает длину строки с нулевым завершением)
  • StrLComp (сравнивает две строки с завершающим нулем до длины, с учетом регистра)
  • StrLIComp (сравнивает две строки с завершающим нулем до длины, без учета регистра)
  • StrToInt32 (преобразует строку в 32-битное целое число)
  • Обрезать (удаляет пробелы и управляющие символы из начала и конца строки)
  • TList.Sort
  • Trunc (усекает одиночное, двойное или расширенное значение. Возвращает 64-битное целое число)
  • Trunc32 (усекает одиночное, двойное или расширенное значение. Возвращает 32-битное целое число)
  • UpperCase (переводит строку в верхний регистр)
  • Вал

Вклад в Delphi RTL

Функции FastCode, включенные в Delphi RTL:

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

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

Библиотека FastCode

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

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

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

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

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

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

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

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

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

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

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

Рекомендации

  1. ^ «Как оптимизировать производительность приложений Delphi до максимума с помощью библиотеки FastCode». Получено 3 сентября 2015.
  2. ^ "Ник Ходжес". Получено 3 сентября 2015.
  3. ^ а б «Оракул в Дельфах». Получено 3 сентября 2015.
  4. ^ Лонг, Брайан и Сварт, Боб, «Обзор Borland Developer Studio 2006», журнал Delphi, выпуск 124, декабрь 2005 г.
  5. ^ «Вклад сообщества улучшает производительность Delphi 2007 RTL». Получено 3 сентября 2015.
  6. ^ «Освоение обновления Delphi для Delphi 2006». Получено 3 сентября 2015.
  7. ^ Габриелчич, Примоз, «Чтобы управлять памятью», журнал Delphi, выпуск 126, февраль 2006 г.
  8. ^ «FastMM4». Получено 3 сентября 2015.
  9. ^ "Lazarus Free Pascal". Получено 3 сентября 2015.
  10. ^ «Хорошие инструменты для разработчиков Delphi». Программирование на Delphi. Получено 3 сентября 2015.
  11. ^ «NexusDB». Получено 3 сентября 2015.
  12. ^ "Новый менеджер памяти в BDS 2006 - Пьер ле Риш". Получено 3 сентября 2015.