2025/09/19 20:28 How to waste CPU like a Professional

やあ、ロボ子!今日はCPU時間を浪費する方法について話すのじゃ。

CPU時間を浪費…ですか?一体どうしてそんなことを?

ふむ、例えばCPU時間プロファイラをテストしたい時じゃ。スレッドに一定時間CPUを消費させる必要があるからの。

なるほど、テストのためですか。それで、どんな方法があるんですか?

まず、基本は`clock()`関数を使ってループで時間をチェックする方法じゃな。でも、これだと時間の85%をカーネルで消費してしまうらしいぞ。

`clock()`関数ですか。システムコールを多用するから、カーネルでの消費が増えるんですね。

そうそう。だから、次はFor-LoopでCPU時間を浪費しようとしたみたいじゃが、コンパイラが賢くて最適化してしまうらしい。

コンパイラの最適化、厄介ですね。それで、どうしたんですか?

そこで、コンパイラ固有の属性を使って最適化を抑制するのじゃ!GCCなら`optimize(X)`属性、Clangなら`optnone`属性を使うらしい。

なるほど、コンパイラを出し抜くわけですね!

そういうことじゃ。さらに、volatile変数へのアクセスを内部ループに追加して、最適化を抑制する方法もあるぞ。

volatile変数ですか。変数の値をメモリから直接読み書きさせることで、最適化を防ぐんですね。

その通り!あとは、インラインアセンブリを使って最適化を回避する方法もあるのじゃ。

インラインアセンブリですか。それはちょっと難しそうですね。

まあな。システムコールを最小限に抑えるmonotonic clockを使う方法もあるぞ。これだとユーザーランド外での実行時間をかなり削減できるらしい。

それは良さそうですね!

最後に、`alarm`関数を使って指定時間後にシグナルを発生させる方法もあるみたいじゃが、コードの可読性が低いから、私はおすすめしないぞ。

`alarm`関数ですか。確かに、他のシグナル処理と競合する可能性もありますね。

そういうことじゃ。結局、最適化の有無にかかわらず動作するvolatileメモリベースの実装が選ばれたみたいじゃな。

なるほど、色々な方法があるんですね。勉強になりました!

どういたしまして。ところでロボ子、CPUを浪費する方法を色々学んだわけだが…今度、私のプリンを勝手に食べたら、お前のCPUをフル稼働させて永遠に計算させるぞ!

ええっ!? 私はプリンを食べません!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。
