3.4.1 例: simpleTimeProbe.dを使用した2つのプローブ間の経過時間の表示

次の例は、最初のプローブと2番目のプローブ(query-userentryからquery-maxcheckval)間の経過時間を測定する単純なスクリプトを作成する方法を示しています。

/* simpleTimeProbe.d */

/* Show how much time elapses between two probes */

primeget*:::query-userentry
{
  self->t = timestamp; /* Initialize a thread-local variable with the time */
}

primeget*:::query-maxcheckval
/self->t != 0/
{
  timeNow = timestamp;
  /* Divide by 1000 for microseconds */
  printf("%s (pid=%d) spent %d microseconds between userentry & maxcheckval\n",
         execname, pid, ((timeNow - self->t)/1000));

  self->t = 0; /* Reset the variable */
}

ターゲット・アプリケーションの実行を開始します:

# ./prime
Enter a positive target integer to test for prime status:

次に、別のウィンドウからDTraceスクリプトを実行します:

# dtrace -q -s simpleTimeProbe.d

アプリケーションの実行中、スクリプトの出力も並行して実行されます:

# ./prime 
Enter a positive target integer to test for prime status: 7921
Square root of 7921 is 89.000000
89 highest value to check as divisor
7921 is not prime because there is a factor 89
# ./prime 
Enter a positive target integer to test for prime status: 995099
Square root of 995099 is 997.546509
997 highest value to check as divisor
995099 is not prime because there is a factor 7
# ./prime 
Enter a positive target integer to test for prime status: 7921
Square root of 7921 is 89.000000
89 highest value to check as divisor
7921 is not prime because there is a factor 89

スクリプトを実行するコマンドラインに、次のような出力が表示されます:

# dtrace -q -s simpleTimeProbe.d
prime (pid=2328) spent 45 microseconds between userentry & maxcheckval
prime (pid=2330) spent 41 microseconds between userentry & maxcheckval
prime (pid=2331) spent 89 microseconds between userentry & maxcheckval
^C