事実上、最適化されていないコードよりも速く答えを計算するコンパイラによって行われる「コードの最適化」は、「省エネルギー」です。(別の投稿者が観察したように、キャッシュ ミスを回避することは大きなメリットです)。したがって、本当の問題は、「実行時間を短縮するのではなく、エネルギーを節約することを明示的に意図した最適化は何ですか?」ということです。(注: 一部の「最適化」では、コードのフットプリント サイズが縮小されます (コードのシーケンスをサブルーチンに抽象化するなどにより)。これには、実際にはより多くのエネルギーが必要になる場合があります)。
どのコンパイラでも見たことのない珍しいものは、データの表現を変更することです。0 ビットを格納/送信するコストは、1 ビットを格納するコストとは異なることがわかります。(TTL と CMOS の私の経験では、「ゼロ」はより高価です。これは、電源から抵抗を介して一種の「アクティブ プルダウン」としてハードウェアに実装されているため、電流が流れて熱が発生するためです。同じプルダウンを介して信号を「フロートハイ」にすることによって実装されます)。偏りがある場合は、ゼロ ビットではなく 1 ビットの数を最大化するようにプログラム コードとデータを実装する必要があります。
データの場合、これは比較的簡単に行うことができます。メモリに見られる価値の非常に優れた調査と分析については、この論文を参照してください。かなり素晴らしいチャートが含まれています。共通のテーマは、多数のメモリ ロケーションが、少数の異なる値のセットのメンバーによって占められているというものです。実際、非常に少数の値 (最大 8) のみがメモリ位置の最大 48% を占有し、多くの場合非常に小さな数値です (一部のプログラムでは、データ転送のかなりの部分が小さな値であることを論文が示しています。 、0 ~ 4 であり、基本的にゼロが最も一般的な値です)。 ゼロが 1 よりも保存/転送に本当にコストがかかる場合、小さな共通値は、値を 1 の補数形式で保存することを提案します。. これは、実装が非常に簡単な最適化です。値が常に最小の N 自然数であるとは限らないことを考えると、メモリ内で N 番目に頻繁に使用される値を N に置き換え、N の補数を格納して、プロセッサに近い実際の値のルックアップを行うことができます。(論文の著者は、ハードウェアの「値の再利用」キャッシュを提案していますが、それはコンパイラの最適化ではありません)。
これをプログラム コードで整理するのは少し難しいです。なぜなら、命令セットが何を言うことができるかを決定し、通常、命令セットはエネルギー測定とは無関係に設計されているからです。それでも、異なる命令シーケンスを選択して (オプティマイザが行うことです)、命令ストリーム内の 1 ビットを最大化することができます。これが従来の命令セットのオペコードに対して非常に効果的であるとは思えません。確かに、アドレスに 1 ビットの数が多い場所に変数を配置し、小さい数字よりも大きい数字のレジスタを使用することを優先することができました (x86 では、EAX はバイナリ レジスタ番号 000 で、EDI はレジスタ番号 111 です)。命令の実行頻度に応じて命令セットを設計する限り、頻繁に実行される命令には 1 ビットの数が多いオペコードを割り当てます。