バイナリオプティマイザは、コンパイラからの既存の出力を受け取り、同じ機能を持つ、より優れた実行ファイルまたは最適化されたマシンコードをライブプログラムメモリ上に生成します。 バイナリオプティマイザ( オブジェクトコードオプティマイザ とも呼ばれる)は、リンクされた実行可能バイナリファイル またはライブプログラムメモリからプログラムのオブジェクトコード またはマシンコード を取得し、リダイレクトまたはコード置換によって呼び出される、機能的には同等でありながらパフォーマンスが向上した最適化されたコードセクションを生成します。プログラムの高速化は 、一般的な最適化目標です。一部のオプティマイザは、更新されたハードウェアをより有効活用するために古いバイナリを最新化することを目的としており、[ 1 ] プロファイルガイド による最適化やプロシージャ 間最適化に大きく依存してパフォーマンスの向上を実現しています。[ 2 ] また、 JITコンパイラと同様の手法を使用して、実行時メカニズムを利用してパフォーマンスを内省的に向上させるものもあります。[ 3 ]
例 COBOL Optimizer は 、1970 年代半ばにCapex Corporation によってCOBOL 用に開発されました。このタイプのオプティマイザは、この場合、標準の IBM COBOL コンパイラの「弱点」に関する知識に依存しており、オブジェクト コードのセクションをより効率的なコードに実際に置き換え (またはパッチを適用 ) ました。置き換えたコードは、たとえば線形テーブル検索を バイナリ検索 に置き換えたり、コンテキスト内で機能的に同等の、比較的遅い命令を既知のより高速な命令に単純に置き換えたりする場合があります。この手法は現在、強度削減 として知られています。たとえば、IBM/360 ハードウェアでは、特定のモデルに応じて、命令は1 バイト比較の命令CLIの 2 倍から 5 倍高速でした。 [ 1 ] [ 4 ] CLC
IBM Automatic Binary Optimizer for z/OS (ABO) は、 最新の IBM Z サーバーで利用可能な新しいハードウェア命令を活用することで、古い COBOL バイナリを最適化してパフォーマンスを向上させます。ABO は、アプリケーションのソース コードからの再コンパイルを必要としません。これにより、古い COBOL アプリケーションは、最新のコンパイラを使用してソースから再コンパイルした場合に可能なパフォーマンスと同等のパフォーマンスを実現でき、新しいツール チェーンを使用してソースから再コンパイルした場合に発生する可能性のある微妙な動作変更のリスクを回避できます。場合によっては、古い COBOL プログラムには元のソース コードが存在しないこともあります。[ 5 ]
SOLAR プロジェクトには、 DEC Alpha 用のALTO 、x86 用のPLTO 、Itanium 用のILTO という 3 つの異なるツールが含まれていました。これらは主にリンク時最適化 (LTO) であり、完成した実行可能ファイルに対してバイナリ最適化ツールとしても機能しました。これらは、ECOFF または ELF バイナリ ファイルと再配置データを入力として受け取り、プロシージャ間制御フロー グラフを再構築しました。ALTOは プログラム全体の分析と最適化を実行し、定数伝播、到達不能コードの削除、インライン化、コード レイアウト、命令スケジューリングなどの技術を適用しました。これらの最適化の多くはプロファイル ガイド付きでした。[ 10 ] また、メモリ アクセスは電力に大きな影響を与えるため、最適化の方向付けにおいてサイクル カウントの推定よりもメモリ操作の削減を優先することで電力節約をターゲットとする作業も行われました。 [ 11 ] PLTO は 、実行可能ファイルに計測器を組み込んで実行時定数の値プロファイルを収集し、コスト ベネフィット分析によって駆動される頻出値のコード パスをクローンして最適化することで、値プロファイル ガイド付き特殊化に焦点を当てました。[ 12 ] ILTO は 、Itanium マシン コードからバンドルを正規化された制御フロー グラフに逆アセンブルし、述語と推測情報を復元し、マシン コードを書き換えて、非述語/非推測、選択的 if 変換、遅延スケジューリング、バンドル、レイアウト変更を適用して、より高速またはより分析しやすいバイナリを生成することで機能しました。[ 13 ] ALTO をベースにしたSqueeze と呼ばれるシステムがあり、これはパフォーマンスを低下させることなく Alpha アーキテクチャ用のバイナリを圧縮するためのバイナリ書き換えツールでした。コード ファクタリングと手続き的抽象化によりコード フットプリントが削減され、共通の命令シーケンスのコード再利用が増加しました。ライブネス分析を使用して、実行可能ファイルからデッド データを特定して削除しました。[ 14 ] [ 15 ]
Dynamo は 、1990 年代後半にHewlett Packard Labs が行った研究プロジェクトで、 HP-UX オペレーティングシステム上で動作するPA-RISC プログラム用の透過的な動的バイナリ オプティマイザを実装しました。 Dynamo は、変更されていないバイナリのインタープリタとして動作し、マシン コードの最もホットなトレースをソフトウェア コード キャッシュに出力します。これらのトレースは、分岐の削減、コード局所性の向上、コピー伝播 、定数伝播 、強度削減 、ループ不変コード移動、ループ展開 の適用によって最適化されます。ターゲット バイナリは、Dynamo の共有ライブラリをロードするために、標準 C ランタイムのカスタム バージョンに再リンクする必要がありました。軽量仮想マシンとして機能したため、ユーザー モード コードとの幅広い互換性がありました。一部の SpecInt95 ベンチマークで最大 22% の高速化を実現しました。[ 3 ] Dynamo は後に、MIT の研究者との協力によりDynamoRIO を 生み出しました。
DynamoRIOは 、オリジナルのDynamoプロジェクトを拡張したオープンソースの動的バイナリ計測フレームワークであり、複数のアーキテクチャとOSにわたるランタイム最適化をサポートしています。 [ 16 ]
ADOREは、変更されていない Itanium バイナリ用の動的オプティマイザを実装した研究プロジェクトでした。共有ライブラリとしてターゲットプロセスにロードされると、コードキャッシュに最適化されたコードトレースを生成し、元のコードを最適化されたバージョンにライブパッチします。このアプローチにより、ホットな領域を最適化されたコードキャッシュにリダイレクトする前に元のコードをネイティブに実行できるため、Dynamoに見られるインタープリタのオーバーヘッドが解消されました。ハードウェアパフォーマンスカウンタを活用してプロファイルガイドによるソフトウェアプリフェッチを実行し、一部のSPEC2000ベンチマークで最大57%の高速化を実現しました。[ 17 ]
COBRAは、 ADORE と同様のアーキテクチャでLinux上の Itanium 実行ファイル用の動的バイナリオプティマイザを実装した研究プロジェクトであり、主にフェーズ検出と再最適化を追加して変化するワークロードに適応し、プロファイルガイド付きプリフェッチ を使用して1つのベンチマークで最大68%の高速化を実現しました。[ 18 ]
Dynimize は、Linux x86-64 プログラム用の動的バイナリ オプティマイザです。ターゲット プロセスにコード キャッシュをロードし、x86 から x86 へのJIT コンパイル とホット パッチを使用してプロファイル ガイド付きコンパイラ最適化を適用し、ターゲットとは別のプロセスとして実行されます。ディスク上のバイナリを変更せずに最小限のシステム変更を重視し、ソースからの再コンパイルやターゲット プロセスの再起動を必要としません。[ 19 ] メモリ内の実行可能コードと共有ライブラリ コードの両方を最適化し、v2 (beta) では変更されていない Linux カーネルとデバイス ドライバもメモリ内で最適化します。[ 20 ] 互換性要件を満たすあらゆるプログラム用の汎用動的バイナリ オプティマイザですが、商用サポートは MySQL/MariaDB データベースでの使用に限定されており、[ 19 ] 最大 55% の高速化が実現されています。[ 21 ]
BOLT は LLVM フレームワーク上に構築されたポストリンク オプティマイザです。サンプル ベースのプロファイリングを利用することで、BOLT はフィードバック指向最適化 とリンク時最適化の両方で構築された高度に最適化され た バイナリであっても、実際のアプリケーションのパフォーマンスを向上させます。GCCおよびClang コンパイラの場合、BOLT は FDO と LTO の上にバイナリを最大 20.4% 高速化し、バイナリが FDO と LTO なしで構築された場合は最大 52.1% 高速化します。最小限のオーバーヘッドでサンプル ベースのプロファイリングを使用することで、Meta のデータセンター全体でバイナリ最適化を実用的に展開することが可能になりました。[ 2 ] Linux カーネルも最適化でき、LLVM プロジェクトに統合されています。[ 22 ]
Propellerは、 Google がウェアハウス規模のアプリケーション向けに開発したプロファイルガイド型再リンク最適化ツールです。完全にリンクされたバイナリとリンカーメタデータおよびランタイムプロファイルを受け取り、サンプリングされたPCをシンボル/基本ブロックにマッピングし、ソースコードの再ビルドを必要とせずに、プログラム全体のプロファイルガイド型レイアウト最適化を実行します。Googleのデータセンター全体で本番環境に展開されており、LLVM プロジェクトに統合されています。最適化対象のバイナリから収集された低オーバーヘッドのサンプルベースのプロファイルを使用することで、従来のソースコードからのプロファイルガイド型最適化よりも正確にプロファイルガイド型コードレイアウト最適化を適用できます。[ 23 ]
参考文献 1 2 「System/360 命令タイミング情報」(PDF) 。2010-07-11にオリジナル(PDF) からアーカイブされました。2010-01-07に 取得 。 1 2 Panchenko, Maksim; Auler, Rafael; Nell, Bill; Ottoni, Guilherme (2019-02-16). "BOLT: データセンターおよびそれ以降のための実用的なバイナリ最適化ツール". 2019 IEEE/ACM 国際コード生成および最適化シンポジウム (CGO) . pp. 2–14 . arXiv : 1807.06735 . doi : 10.1109/CGO.2019.8661201 . ISBN 978-1-7281-1436-1 . S2CID 49869552 . 1 2 3 「透過的な動的最適化:Dynamoの設計と実装」 (PDF) 。 2003年5月3日に オリジナル (PDF) からアーカイブされました。 ↑ Evans, Michael (1982-12-01). "Cobol環境のためのソフトウェアエンジニアリング" . Communications of the ACM . 25 (12): 874– 882. doi : 10.1145/358728.358732 . S2CID 17268690 . 1 2 「IBM Automatic Binary Optimizer for z/OS」 . IBM . 2025年12月16日に オリジナル からアーカイブされました。 ↑ Cohn, Robert S.; Goodwin, David W.; Lowney, P. Geoffrey (1997). "Spike を使用した Windows NT 上の Alpha 実行ファイルの最適化" (PDF) . Digital Technical Journal . 9 (4): 3– 20. 2025-12-16 の オリジナル からアーカイブ済み。 ↑ Flower, Richard; Luk, Chi-Keung; Muth, Robert; Patil, Harish; Shakshober, John; Cohn, Robert; Lowney, P. Geoffrey (2001). "Kernel Optimizations and Prefetch with the Spike Executable Optimizer with Spike" . ↑ 「バイナリコード最適化ツール」 。 2010年7月22日にオリジナルから アーカイブ済み 。 2010年1月7日 に取得。 ↑ 「Oracle Solaris Binary Optimizer」 。 2024年9月14日にオリジナルから アーカイブされました。 1 2 Muth, R.; Debray, SK; Watterson, S.; De Bosschere, Koen (2001). "Alto: Compaq Alpha 用リンクタイムオプティマイザ" (PDF) . Software—Practice and Experience . 31 (1): 67– 101. doi : 10.1002/1097-024X(200101)31:1 < 67::AID-SPE357 > 3.0.CO ; 2-A . 2008-02-21 の オリジナル (PDF) からアーカイブ済み。2025-12-17 に 取得 。 ↑ Debray, Saumya; Muth, Robert; Watterson, Scott (2001). Software Power Optimization via Post-Link-Time Binary Rewriting (PDF) (Technical report). Department of Computer Science, University of Arizona . Retrieved 2025-12-29 . ↑ Schwarz, Benjamin William (2002). Intel IA-32 アーキテクチャにおけるリンク後最適化 (PDF) (優等論文). アリゾナ大学。2006 年 3 月 1 日に オリジナル (PDF)からアーカイブ済み。2025 年 12 月 17 日 に取得 。 ↑ Snavely, Noah. Itaniumバイナリの最適化とリバースエンジニアリング (PDF) (学位論文)。 2006年3月1日に オリジナル (PDF)からアーカイブ済み。 2025年12月17日 取得 。 ↑ De Sutter, Bjorn; De Bus, Bruno; De Bosschere, Koen; Debray, Saumya. グローバルコードとデータ圧縮の組み合わせ (PDF) . ゲント大学電子情報システム学部 / アリゾナ大学コンピュータサイエンス学部 . 2025年12月29日 取得. ↑ " 「SOLAR」ソフトウェアのリンク時および実行時における最適化」。 2016年2月14日にオリジナルからアーカイブされました。↑ Bruening, Derek; Garnett, Timothy; Amarasinghe, Saman (2003). An Infrastructure for Adaptive Dynamic Optimization . International Symposium on Code Generation and Optimization (CGO) . Retrieved 2026-01-13 . ↑ Lu, Jiwei; Chen, Howard; Fu, Rao; Hsu, Wei-Chung; Othmer, Bobbie; Yew, Pen-Chung (2003). 動的最適化システムにおけるランタイムデータキャッシュプリフェッチのパフォーマンス (PDF) . MICRO 36 (第36回IEEE/ACM国際マイクロアーキテクチャシンポジウム). 2024年7月5日に オリジナル (PDF)からアーカイブ。 2025年12月18日 に取得 。 ↑ キム・ジンピョ、シュー・ウェイチュン、ユー・ペンチュン (2007)「COBRA: マルチスレッドアプリケーション向け適応型ランタイムバイナリ最適化フレームワーク」 2007年国際並列処理会議 (ICPP 2007) . p. 25. doi : 10.1109/ICPP.2007.23 . ISBN 978-0-7695-2933-2 . S2CID 15079211 . 1 2 「Dynimize 製品概要」 . dynimize.com . Dynimize Inc. 2025年8月11日に オリジナルからアーカイブ済み 。 2025年12月18日 に取得。 ↑ 「Dynimizeユーザーガイドv2」 。dynimize.com。Dynimize Inc. 2025年12月18日にオリジナルからアーカイブ 。 2025 年 12 月18日 に取得。 ↑ 「DynimizeによるMySQLおよびMariaDBのCPUパフォーマンスの向上」 . dynimize.com . Dynimize Inc. 2024年6月23日に オリジナルからアーカイブ済み 。 2025年12月18日 に取得。 1 2 "OptimizingLinux.md" . GitHub . llvm/llvm-project. 2025-08-02 の オリジナルからアーカイブ済み。2025-12-18 に 取得 。 ↑ Shen, Han; Pszeniczny, Krzysztof; Lavaee, Rahman; Kumar, Snehasish; Tallam, Sriraman; Li, Xinliang David (2023). Propeller: A Profile Guided, Relinking Optimizer for Warehouse-Scale Applications . Proceedings of the 28th ACM International Conference on Architectural Support for Programming Languages and Operating Systems. ASPLOS '23. ACM. pp. 617–631 . 2025-07-02 の オリジナル からアーカイブ済み。2025-12-18 に 取得 。