Фасткод
FastCode — это проект программирования с открытым исходным кодом , цель которого — предоставить оптимизированные библиотеки времени выполнения для Embarcadero Delphi и C++ Builder . Этот проект, управляемый сообществом, был начат в 2003 году Деннисом Кьером Кристенсеном и с тех пор внес оптимизированную функциональность в 32-битную библиотеку времени выполнения Delphi (RTL).
FastCode, организованный как соревнование, разделенное на задачи, фокусируется на оптимизации конкретных функций для решения множества задач. Проект предлагает инструменты сравнительного анализа и процессы проверки для каждой функции. Вклад подсчитывается, при этом баллы начисляются в зависимости от достижения поставленных целей. Embarcadero распознает и включает код, созданный командой FastCode, в свою кодовую базу Delphi. Большинство участников этого проекта — разработчики ассемблера, использующие код, специфичный для процессора. Список задач, решаемых проектом FastCode, обширен; он охватывает различные области: от функций манипулирования строками, таких как PosEx или CompareText, до математических операций, таких как Power или Int64Mul.
Структура
[ редактировать ]Проект организован в виде конкурса, разделенного на задачи. Каждая задача берет одну функцию и оптимизирует ее для нескольких целей. Проект предоставляет инструменты для сравнительного анализа и проверки вклада каждой функции. За вклад начисляется один балл (баллы начисляются максимум за одну функцию на цель), а победителю цели присуждаются десять баллов. Ведется список всех участников и их оценок, и в конце каждого года, до 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 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 ( расширенный стандарт шифрования )
- AnsiStringReplace (Заменяет вхождения подстроки внутри строки.)
- ArcCos (вычисляет обратный косинус. Перегруженные версии для одинарной, двойной и повышенной точности.)
- ArcSin (Рассчитывает обратную синусоиду. Перегруженные версии для одинарной, двойной и повышенной точности.)
- Ceil32 (Возвращает наибольшее целое число, близкое к 32-битному.)
- Ceil64 (Возвращает наибольшее, близкое к 64-битному, целое число.)
- CharPos (ищет первое вхождение символа в строке. Возвращает позицию этого вхождения.)
- CharPosIEx (регистронезависимый поиск первого вхождения символа Char в строку, начиная с индекса, переданного в качестве параметра. Возвращает позицию этого вхождения.)
- CharPosEy (ищет n-е вхождение символа Char в строке, начиная с индекса, переданного в качестве параметра. Возвращает позицию этого вхождения.)
- CharPosRev (ищет последнее вхождение символа Char в строку. Возвращает позицию этого вхождения.)
- CompareMem (Сравнивает два блока памяти.)
- CompareStr (Сравнивает две строки типа AnsiString.)
- CompareText (Сравнивает две строки.)
- Fillchar (заполняет раздел буфера хранения одним и тем же байтом или символом FillValue FillCount раз.)
- Floor32 (Возвращает наименьшее целое число, близкое к 32-битному.)
- Floor64 (Возвращает наименьшее целое число, близкое к 64-битному.)
- НОД32 (наибольший общий делитель, 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 (ищет первое вхождение подстроки в строку. Возвращает позицию этого вхождения.)
- PosEx (поиск первого вхождения подстроки в строке, начиная с индекса, переданного в качестве параметра. Возвращает позицию этого вхождения.)
- PosIEx (регистронезависимый поиск первого вхождения подстроки в строке, начиная с индекса, переданного в качестве параметра. Возвращает позицию этого вхождения.)
- Мощность (возвращает основание, возведенное в степень)
- Сложение прямоугольных комплексных чисел
- Вычитание прямоугольного комплексного числа
- Умножение прямоугольного комплексного числа
- Деление прямоугольного комплексного числа
- Преобразование прямоугольного формата в полярный
- RGBA в BGRA (преобразование растрового формата)
- Округление (банковское округление по одиночному, двойному или расширенному значению. Возвращает 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.
- Дельфи 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 ( 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 компании собственная RAD Studio . В блоге Холлварда описывается FastMM4 и почему он используется в качестве менеджера памяти в приложении «The Online Trader» .
Ссылки
[ редактировать ]- ^ «Как максимально оптимизировать производительность приложений Delphi с помощью библиотеки FastCode» . Проверено 3 сентября 2015 г.
- ^ «Ник Ходжес» . Проверено 3 сентября 2015 г.
- ^ Jump up to: а б «Оракул в Дельфах» . Проверено 3 сентября 2015 г.
- ^ Лонг, Брайан и Сварт, Боб, «Обзор Borland Developer Studio 2006», The Delphi Magazine, выпуск 124, декабрь 2005 г.
- ^ «Вклад сообщества улучшает производительность RTL Delphi 2007» . Архивировано из оригинала 6 марта 2016 года . Проверено 3 сентября 2015 г.
- ^ «Освоение обновления Delphi для Delphi 2006» . Проверено 3 сентября 2015 г.
- ↑ Габриельчич, Примоз, «Управлять памятью», журнал Delphi, выпуск 126, февраль 2006 г.
- ^ «БыстрыйММ4» . Проверено 3 сентября 2015 г.
- ^ «Лазарь Фри Паскаль» . Проверено 3 сентября 2015 г.
- ^ «Хорошие инструменты для разработчиков Delphi» . Программирование на Делфи . Проверено 3 сентября 2015 г.
- ^ «НексусДБ» . Проверено 3 сентября 2015 г.
- ^ «Новый менеджер памяти в BDS 2006 — Пьер ле Риш» . Проверено 3 сентября 2015 г.