OK、あなたの本当の目標は、コードをできるだけ速くすることだと思いますよね?
関数にかかる時間を調べることでそれを行うと想定するのは自然なことですが、それを見る別の方法があります。
プログラムを実行すると、ウィンドウの外にある実際のツリーのような呼び出しツリーがトレースされると考えてください。トランクはmain
関数のようなものであり、ブランチが分岐する場所は別の関数を呼び出すようなものです。
それぞれの「葉」に一定の時間がかかり、できるだけ多くの葉を取り除くために木を剪定したいとします。
一つの方法は、葉がたくさんある枝を見つけて、葉を切り落とすことです。もう1つの方法は、必要がない場合はブランチ全体を切り取る方法です。問題は、必要のない重い枝を見つけることです。
これを行うための骨の簡単な方法の1つは、10枚など、ランダムにいくつかの葉を選び、それぞれについて、その枝から幹までの線をトレースすることです。どの分岐点にも、葉から幹まで、いくつかのこれらの線が走っています。その分岐点を通る線が多いほど、その枝にある葉が多くなり、剪定することで節約できます。
これをプログラムに適用する方法は次のとおりです。リーフをサンプリングするには、プログラムをランダムに一時停止し、呼び出しスタックを確認します。それがトランクに戻るラインです。その上の各呼び出しサイト(機能ではなく、呼び出しサイト)は分岐点です。その呼び出しサイトがサンプルの一部(40%など)にある場合、それは、プルーニングすることでおおよそどれだけ節約できるかです。
したがって、関数にかかる時間を測定するものとは考えないでください。どのコールサイトが「重い」かを尋ねるようなものだと考えてください。これですべてです。