3.5.4. アレイ内での複数要素の処理
アレイで十分な情報を収集したら、それを有用なものにするためにアレイで全要素を取得して処理する必要があります。例3.14「vfsreads.stp」 を見てみましょう。このスクリプトは各プロセスが何回 VFS 読み込みを行ったかという情報を収集しますが、その情報をどうするかについては指定していません。例3.14「vfsreads.stp」 を有用にする簡単な方法は、
reads
アレイで鍵のペアをプリントすることです。
アレイ内の鍵のペアすべてを処理する最善の方法 (反復として) は、
foreach
ステートメントを使用することです。以下の例を見てみましょう。
例3.15 cumulative-vfsreads.stp
global reads probe vfs.read { reads[execname()] ++ } probe timer.s(3) { foreach (count in reads) printf("%s : %d \n", count, reads[count]) }
例3.15「cumulative-vfsreads.stp」 の 2 つ目のプローブでは、
foreach
ステートメントが count
変数を使用して reads
アレイ内の一意の鍵の反復を参照しています。同じプローブ内の reads[count]
アレイステートメントは、一意の鍵の関連する値を取得します。
例3.15「cumulative-vfsreads.stp」 の最初のプローブでは、スクリプトは VFS-read の統計情報を 3 秒ごとにプリントし、VFS-read を実行したプロセス名とその回数を表示します。
例3.15「cumulative-vfsreads.stp」 の
foreach
ステートメントは、順不同でアレイ内のプロセス名の 全 反復をプリントすることに注意してください。+
(昇順) または -
(降順) を使用すると、スクリプトに特定の順番で反復をプロセスするよう指示することができます。さらに、limit value
オプションを使うと、スクリプトがプロセスする反復数を制限することもできます。
以下の代替プローブ例を見てみましょう。
probe timer.s(3) { foreach (count in reads- limit 10) printf("%s : %d \n", count, reads[count]) }
この
foreach
ステートメントは、スクリプトにアレイ reads
内の要素を (関連する値の) 降順で処理するよう指示します。limit 10
オプションは、foreach
に最初の 10 の反復のみを処理するよう指示します (つまり、値の高い上位 10 位の反復のみをプリントします)。