あなたの直感は時間とともに向上します。多分少々物議をかもしますが、VTuneとCodeAnalyst、そして今はCodeXLを長年使用してきたので、少なくとも直近ではホットスポットがどこになるかについて、以前よりもはるかに正確になったと思いますコードのプロファイルを作成するときに、完全に不意を突かなくなったポイント。それは私が物事を盲目的に最適化しようとすることを意味しません。
プロファイリングは、プロファイラーへの依存度を実際に増加させたものであり、軽減するものではありません。プロファイリングの結果がある程度容易に予測でき、さらにホットスポットを正常に排除し、暗闇や行方不明者に盲目的な刺し傷をすることなくユーザーエンド操作を完了するのにかかる時間を改善できると言っているだけですプロファイラを使用していても、ホットスポットとは何かだけでなく、キャッシュミスなどの理由で正確にホットスポットである理由を理解できるようになるまで実行できます)。
ただし、プロファイラーを使い始めてから直観を改善し始めました。理由の1つは、コードに精通している場合、最大かつ最も明白なホットスポットに関しては正しいかもしれませんが、その間のすべての微妙さではないからです。当然、完了するのに1時間かかるユーザーエンド操作があり、100,000要素にわたる入力を処理する1つのギャップのある2次複雑度アルゴリズムがある場合、おそらく2次複雑度であるという考えで人生全体の節約を豊かに賭けることができますここで障害のあるアルゴリズム。しかし、それはあなたに詳細な洞察を与えるものではなく、たとえば、時間に貢献していないものを正確に知らせるものでもありません。
プロファイリングを開始し、時間の大きな貢献であると思われるすべてのものがあまり時間を費やしていなかった場所を確認するときに、非常に多くの価値があります。明らかな非効率性の原因ではなく、疑わしいものはわずかに非効率的だったかもしれませんが、プロファイリング後、それらがいつでもほとんど寄与していないことに気付きました。そして、最も直感的な洞察を得る可能性があるのは、正確にどれだけの時間を費やしているかが明らかでない微妙な領域すべてで自分が間違って表示されることです。
明らかなアルゴリズムの複雑さを超えた人間の直感は、機械にとって効率的なものと人間の心にとって効率的なものが非常に異なるため、しばしば間違った状態から始まります。レジスタからCPUキャッシュ、DRAM、ディスクに至るメモリ階層について考えることは、最初はそれほど直感的ではありません。ルックアップテーブルの分岐やメモリアクセスを増やして処理作業をスキップするよりも、冗長な演算の方が高速であると考えるのは直感的ではありません。私たちは、意思決定のコストやメモリの負荷とストアなどを割り引きながら、どれだけの作業を行うべきかという観点から考える傾向があります。ハードウェアにとって効率的なことは、多くの場合、人間の前提をすべて破り始めるという点で非常に直感に反します。
その直観を改善できるのは、プロファイリングを通してインターフェース設計です。インターフェースの設計は、後から見直すと非常にコストがかかり、そのインターフェースに応じて場所の数に比例してコストが上昇します。直感の改善を開始すると、コストのかかる設計変更を行わずに将来の最適化のための余裕を残す方法で、インターフェイスの設計を最初から改善できます。繰り返しになりますが、その直観は一般的に開発するものであり、常にそのプロファイラーを手元に置いておくことで、無期限に開発を続けます。