FastCodeは、 Embarcadero DelphiおよびC++ Builder向けに最適化されたランタイム ライブラリ ルーチンを提供することを目的としたオープン ソース プログラミングプロジェクトです。このコミュニティ主導のプロジェクトは、2003 年に Dennis Kjaer Christensen によって開始され、それ以来、32 ビット Delphi ランタイム ライブラリ (RTL) に最適化された機能を提供してきました。
課題に分かれたコンテストとして組織された FastCode は、複数のターゲットに対して特定の機能を最適化することに重点を置いています。プロジェクトでは、各機能の貢献に対してベンチマーク ツールと検証プロセスを提供しています。貢献は採点され、ターゲットに対するパフォーマンスに基づいてポイントが付与されます。Embarcadero は、FastCode チームが作成したコードを認識し、Delphi コードベースに組み込みます。このプロジェクトの参加者のほとんどは、プロセッサ固有のコードを使用するアセンブラ開発者です。FastCode プロジェクトが取り組む課題のリストは膨大で、PosEx や CompareText などの文字列操作機能から、Power や Int64Mul などの数学演算まで、さまざまな領域をカバーしています。
構造
このプロジェクトは、課題に分かれたコンペティションとして構成されています。各課題では、1 つの関数を取り上げ、それをいくつかのターゲットに対して最適化します。プロジェクトでは、各関数の貢献をベンチマークして検証するためのツールを提供します。貢献ごとに 1 ポイントが与えられ (ポイントが与えられるのは、ターゲットごとに最大 1 つの関数)、ターゲットの勝者には 10 ポイントが与えられます。すべての貢献者とそのスコアのリストが維持され、2008 年まで毎年末に勝者が表彰されました。歴史的には、 DelphiとC++ Builderの所有者であるBorland、Codegear、Embarcadero が賞を後援してきました。
コンテスト参加者の大半は、プロセッサ固有の32ビットコードやMMX、SSE、SSE2、SSE3、SSSE3、SSE4などの追加命令セットを利用することが多いアセンブラ開発者です。[1]
このプロジェクトは、FastCode チームの貢献を認め、そのコードを Delphi のコードベースに組み込んだ Embarcadero のサポートを受けています。[2] Embarcadero Delphiの デフォルトのメモリ マネージャである FastMM4 は、FastCode Memory Manager チャレンジの優勝者です。[3]
このプロジェクトは最初、Robert Lee の OptimalCode サイトでホストされ、そのソースコードのホームページは [1] で、2008 年に最終更新されました。ソースコードには、拡張ルーチンとルーチンをベンチマークするためのテストスイートの両方が含まれています。2017 年には、Move、FillChar、メモリマネージャーのベンチマークルーチンが 64 ビットに移植され、[2] で入手できます。
テスト
FastCode プロジェクトはテストに多大な労力を費やしており、非常に高品質のソフトウェアを提供することに重点を置いています。テストは、正確性のテストと速度のテストの 2 つのカテゴリに分かれています。
検証
検証は、ターゲット セットのすべての CPU で実行されますが、多くの場合、他の CPU や OS ( Windows XP、Windows Vista、Windows 7など) でも実行されます。検証は、通常の使用ケースとエラー使用ケースの両方で、さまざまな関数入力にわたって実行されます。検証は、既知の正しい値と、既存の RTL 関数などの参照実装に対して実行されます。
ベンチマーク
ベンチマークは、特定の時点で現在のターゲット セットの一部であるすべての CPU で実行されます。これらの CPU は、ターゲット セットの一部であったか、現在もその一部です ( Intel Pentium 3、Intel Pentium M、Intel Pentium 4、Intel Core、Intel Core 2、AMD Athlon XP、AMD Opteron、AMD Phenom )。ベンチマークを安定して現実的なものにするために、細心の注意が払われています。特に、メモリ マネージャー チャレンジ ベンチマークは公平に行うことが難しく、メモリ マネージャーの使用ログは、実際のアプリケーションの通常の使用から作成され、ベンチマークによって再生されました。
ターゲット
テストはターゲット セット全体で行われます。新しいターゲット セットは、FastCode コミュニティが投票できるアンケートによって毎年決定されます。ターゲット セットは通常、6 つの CPU で構成され、そのうち 4 つは Intel 製、2 つは AMD 製です。この比率は、市場シェアを模倣するために選択されています。これらの 6 つの CPU ターゲットに加えて、6 つの CPU の組み合わせとして定義された 10 のターゲットがあります。これらの 10 のターゲットは計算ターゲットと呼ばれ、速度のみ、または速度とサイズの組み合わせにすることができます。許可される最大命令セットはターゲットごとに異なります。ターゲットは、「IA32 サイズ ペナルティ」または「SSE2」である可能性があります。サイズに対するペナルティは、各チャレンジごとにアンケートによって決定されます。
課題リスト
FastCodeプロジェクトでは、以下のチャレンジを実施しました[3]。
- AES (高度暗号化標準)
- AnsiStringReplace (文字列内の部分文字列の出現を置き換えます。)
- ArcCos (逆余弦を計算します。単精度、倍精度、拡張精度のオーバーロード バージョンです。)
- ArcSin (逆正弦を計算します。単精度、倍精度、拡張精度のオーバーロード バージョンです。)
- Ceil32 (32 ビット整数の最大値を返します。)
- Ceil64 (64 ビット整数の最大値を返します。)
- CharPos (文字列内で Char が最初に出現する位置を検索します。この出現位置を返します。)
- CharPosIEx (パラメータとして渡されたインデックスから始まる文字列内の Char の最初の出現を大文字と小文字を区別せずに検索します。この出現の位置を返します。)
- CharPosEy (パラメータとして渡されたインデックスから始まる文字列内の Char の n 番目の出現を検索します。この出現の位置を返します。)
- CharPosRev (文字列内で Char が最後に出現する位置を検索します。この出現位置を返します。)
- CompareMem (2 つのメモリ ブロックを比較します。)
- CompareStr (AnsiString 型の 2 つの文字列を比較します。)
- CompareText (2 つの文字列を比較します。)
- Fillchar (ストレージ バッファーのセクションを、同じバイトまたは文字の FillValue で指定された回数だけ埋めます。)
- Floor32 (32 ビット整数の最小値を返します。)
- Floor64 (64 ビット整数の最小値を返します。)
- GCD32 (最大公約数 32 ビット)
- IDCT (逆離散コサイン変換)
- Int64Div (2つの64ビット整数を割り算する)
- Int64Mul (2つの64ビット整数を乗算します)
- IntToStr (整数を文字列に変換します)
- IsPrime (32 ビット整数が素数かどうかをテストします)
- LowerCase (文字列を小文字に変換します)
- MaxFP (2 つの単精度浮動小数点値、倍精度浮動小数点値、または拡張浮動小数点値の最大値を返します)
- MaxInt (2 つの整数値の最大値を返します)
- MaxInt64 (2 つの 64 ビット整数値の最大値を返します)
- メモリマネージャー
- MinFP (2 つの単精度浮動小数点値、倍精度浮動小数点値、または拡張浮動小数点値の最小値を返します)
- MinInt (2つの整数値の最小値を返します)
- MinInt64 (2 つの 64 ビット整数値の最小値を返します)
- 移動(ソースから宛先にNバイトをコピー)
- 極座標複素数加算
- 極座標複素数減算
- 極座標複素数の乗算
- 極複素数除算
- 極座標から直交座標への変換
- Pos (文字列内で部分文字列の最初の出現を検索します。この出現の位置を返します。)
- PosEx (パラメータとして渡されたインデックスから始まる文字列内の部分文字列の最初の出現を検索します。この出現の位置を返します。)
- PosIEx (パラメータとして渡されたインデックスから始まる文字列内の部分文字列の最初の出現を大文字と小文字を区別せずに検索します。この出現の位置を返します。)
- 累乗(底を指数で累乗したものを返す)
- 直角複素数加算
- 直角複素数減算
- 直角複素数の乗算
- 直角複素数除算
- 直交座標から極座標への変換
- RGBA から BGRA (ビットマップ形式変換)
- Round (Single、Double、Extended の値を Bankers で丸めます。64 ビットの整数を返します)
- RoundToEx (「銀行型丸め」を使用して、拡張精度浮動小数点値を指定された数字または 10 の累乗に丸めます。)
- Round32 (Single、Double、Extended の値を Bankers で丸めます。32 ビットの整数を返します)
- 縮小(ビットマップの拡大縮小)
- 選別
- StrComp (大文字と小文字を区別して、2 つの null 終端文字列を比較します)
- StrCopy (ヌル終端文字列を別のヌル終端文字列にコピーする)
- StrIComp (大文字と小文字を区別せずに、2 つの null 終端文字列を比較します)
- StrLen (ゼロで終了する文字列の長さを返します)
- StrLComp (大文字と小文字を区別して、長さまで 2 つの NULL 終端文字列を比較します)
- StrLIComp (大文字と小文字を区別せずに、長さまで 2 つの NULL 終端文字列を比較します)
- StrToInt32 (文字列を 32 ビット整数に変換します)
- トリム(文字列の先頭と末尾から空白と制御文字を削除します)
- Tリスト.ソート
- Trunc (Single、Double、または Extended 値を切り捨てます。64 ビット整数を返します)
- Trunc32 (Single、Double、または Extended 値を切り捨てます。32 ビット整数を返します)
- UpperCase (文字列を大文字に変換します)
- ヴァル
Delphi RTLへの貢献
Delphi RTL に含まれる FastCode 関数:
- Delphi 2005: CompareText、Int64Div、FillChar。
- Delphi 2006: [4] CompareText、Int64Div、FillChar、FastMM4メモリマネージャ。[3]
- Delphi 2007—Delphi XE: ArcCos、ArcSin、Power、PosEx、Move、Memory Manager、FillChar、Pos、__lldiv、LowerCase、UpperCase、CompareStr、CompareMem、CompareText、StrLen、StrCopy、StrComp。[5]
Marco Cantu著のMastering Delphiには、Delphi RTLへの貢献を列挙したFastCodeに関する章が含まれています。[6]
FastCodeライブラリ
チャレンジの優勝者全員の作品は、FastCode ライブラリ (http://fastcode.sourceforge.net/challenge_content/rtl_replcmnt_pkg.html) に収録されています。このライブラリはオープンソースで、MPL ライセンスに基づいてリリースされています。このライブラリは、1) 関数を直接呼び出す方法と、2) パッチ機能を使用する方法の 2 つの方法で使用できます。
関数を直接呼び出す場合、最も高速と思われる関数のバージョンを呼び出すかどうかは、アプリケーション開発者次第です。
パッチ適用機能を使用する場合、ライブラリはアプリケーションのロード時に CPU タイプを自動的に検出し、この情報を使用してすべての関数呼び出しをその特定の CPU の FastCode 勝者関数にリダイレクトします。
FastMM4 メモリマネージャー
2006年以来DelphiとC++ Builderで使用されているFastMMメモリマネージャもFastCodeコンペティションの優勝者です。[7]これはDelphiの標準メモリマネージャに代わるもので、メモリの断片化が起こりにくいだけでなく、アプリケーションを閉じるときにメモリリークを報告したり、 [8]メモリ解放後の使用や二重解放を検出したりするなど、デバッグの可能性も向上しています。
FastMM4はLazarusで開発されたアプリケーションのメモリマネージャとしても使用されます。[9]
FastMM4は、Delphi開発者にとって「必須」のツールとしてよく挙げられます。[10]
Nexus DBにはリークチェック用のFastMM4統合機能が付属しています。[11]
FastMMの使用法については、「BDS 2006の新しいメモリマネージャ」に記載されています。[12]
FastCode を使用するアプリケーション
Delphi または C++ Builder で開発されたアプリケーションは、通常、デフォルトのメモリ マネージャである FastMM4 を使用します。RTL の FastCode 関数は、最も一般的に使用されるものとして選択されており、アプリケーションでも、特に文字列処理が行われる場合は、通常、これらの関数のいくつかが使用されます。したがって、ほとんどの Delphi/C++ Builder アプリケーションは、FastCode プロジェクトによって開発されたコードを使用します。例としては、Skype、FL Studio、Embarcadero独自のRAD Studioなどがあります。Hallvard のブログでは、FastMM4 について、および「The Online Trader」アプリケーションでメモリ マネージャとして FastMM4 が使用されている理由について説明しています。
参考文献
- ^ 「FastCode ライブラリを使用して Delphi アプリケーションのパフォーマンスを最大限に最適化する方法」 。2015年9 月 3 日閲覧。
- ^ 「ニック・ホッジス」 。 2015年9月3日閲覧。
- ^ ab 「デルフォイの神託」2015年9月3日閲覧。
- ^ ブライアン・ロング & ボブ・スワート、「Borland Developer Studio 2006 レビュー」、Delphi Magazine、第 124 号、2005 年 12 月
- ^ 「コミュニティの貢献により Delphi 2007 RTL のパフォーマンスが向上」。2016 年 3 月 6 日時点のオリジナルよりアーカイブ。2015年9 月 3 日閲覧。
- ^ 「Mastering Delphi Update for Delphi 2006」 。2015年9 月 3 日閲覧。
- ^ ガブリイェルチッチ、プリモズ、「メモリを管理する」、デルファイ マガジン、第 126 号、2006 年 2 月
- ^ 「FastMM4」 。 2015年9月3日閲覧。
- ^ 「Lazarus Free Pascal」 。 2015年9月3日閲覧。
- ^ 「Delphi 開発者向けの優れたツール」。Delphiプログラミング。2015年9 月 3 日閲覧。
- ^ 「NexusDB」 。 2015年9月3日閲覧。
- ^ 「BDS 2006 の新しいメモリ マネージャー - Pierre le Riche 著」 。2015年9 月 3 日閲覧。
