範囲データ型およびバケット・データ型
範囲データ型およびバケット・データ型
Vue における範囲データ型は、一定の定義済み範囲のデータ・ポイントの分布を処理するように設計されています。 範囲データ型の定義済み変数の各範囲には、対応する範囲値内に収まるエレメント数のカウントが表示されます。 範囲データ型は、範囲の整数型および文字列型をサポートします。 整数範囲の範囲値の分布は、2 の累乗分布または線形分布のいずれかです。 範囲値の線形分布および 2 の累乗分布の例を以下に示します。
線形分布:
| 範囲 | 数 |
|---|---|
| 0 - 5 | 2 |
| 5 - 10 | 4 |
| 10 - 15 | 1 |
| Others | 20 |
2 の累乗分布:
| 範囲 | 数 |
|---|---|
| 1 から 2 | 2 |
| 2 - 4 | 9 |
| 4 - 8 | 2005 |
| 8 - 16 | 4 |
| 16 - 32 | 1999 |
| 32 - 64 | 7 |
| Others | 5 |
上記の分布は、範囲値の下限より大か等しく、かつ上限より小さいエレメント数のカウントを示しています。 例えば、2 の累乗分布では、4 以上 8 未満のデータのカウントは 2005 です。 定義された範囲に入らない値のカウントは「Others」の範囲に表示されます。
文字列範囲の例
例:
| 範囲 | 数 |
|---|---|
| Read、write、open | 87 |
| Close、foo1 | 3 |
| foo2 | 1 |
| Others | 51 |
前の例では、分布は、範囲値内に特定の文字列が現れる回数を示します。 この例では、read、write、および open が 87 回呼び出されています。
範囲データ型の宣言と初期化:
範囲データ型はキーワード range_t を使用して宣言できます。 例えば、Vue スクリプトで次のように宣言すると、2 つの範囲データ型変数が定義されます。
range_t T1, T2; // T1 and T2 are of Range data type variables.
ルーチン set_range および add_range は、いずれの特定の範囲データ型変数についても整数範囲および文字列範囲を初期化するのに使用されます。
整数範囲データ型の初期化: 整数範囲の初期化には、ルーチン set_range が使用されます。 set_range の構文は、範囲値の線形分布の場合と 2 の累乗分布の場合で異なります。 線形分布の場合のルーチン set_range の構文は、以下のようになります。
void set_range(range_t range_data, LINEAR, int min, int max, int step);
例:
set_range(T1, LINEAR, 0, 100, 10);
前の例では、ルーチン set_range は範囲データ T1 を初期化します。 範囲データ T1 は値の線形分布を持ちます。 T1 の下限は 0 で、上限は 100 です。 各範囲のサイズは 10 です。 前の例の分布は次のようになります。
| 範囲 | 数 |
|---|---|
| 0 - 10 | ... |
| 10 - 20 | ... |
| 20 - 30 | ... |
| ... | ... |
| ... | ... |
| 90 - 100 | ... |
2 の累乗分布の初期化の構文は、以下のようになります。
set_range(range_t range_data, POWER, 2);
例:
set_range(T2, POWER, 2);
この例では、ルーチンにより、範囲型データ T2 が 2 の累乗分布範囲型として初期化されます。
文字列範囲データ型の初期化: 文字列範囲データ型の初期化は、ルーチン add_range によって行われます。
Sytax:
void add_range(range_t range_data , String S1, String S2, ..., String Sn);
例:
add_range(T1, “read”, “write”, “open”);
このルーチンにより、文字列 read、write、および open が range_t データ T1 の 1 つのスロットに追加されます。 同じ range_t データ T1 に別の add_range を指定すると、ストリングが次のスロットに追加されます。
add_range(T1, “close”, “func1”, “func2”);
このルーチンでは、文字列 close、func1、および func2 が次のスロットの range_t データ T1 に追加されます。
- range_t データ型の宣言は @@BEGIN 節でのみ実行できます。
- ルーチン set_range の初期化は @@BEGIN 節内でのみ使用できます。
- 範囲値が整数である範囲データ型は 1 回のみ初期化できます。 同じ変数を 2 回初期化することはできません。
例:
set_range(T1, LINEAR, 0, 50, 5); // Valid syntax set_range(T1, LINERA, 10, 100, 10); // Error, cannot initialize an already // initialized T1. set_range(T1, POWER, 2); // Error, T1 has already initialized. add_range(T1, “read”, “write”); // Error, T1 has already initialized. - パラメーター
min、max、およびstepは、set_range ルーチンでは整数定数でなければなりません。
範囲データ型の保管および出力:
qrange ルーチンを使用すると、範囲データ型を連想配列内に値として保管できます。 qrange ルーチンは、頻度およびカウントを増分する必要があるスロット番号を検出します。
例:
この例では、T1 は range_t データ型であり、その範囲値は整数型です。
qrange(aso[“read”], T1, time_spent);
この例では、qrange ルーチンにより、time_spent が失敗するスロット番号が検出され、そのスロット番号のカウントは、キー「read」に対応する連想配列 aso について増分されます。
以下の例では、T2 は range_t データ型であり、範囲値は文字列型です。
qrange(aso[“function usage”], T2,get_function());
この例では、 qrangeroutineは、3番目の引数として渡された関数が失敗したスロット番号を検出し、asoのスロットのカウントを、function usageキーに対応する連想配列に加算します。
- どの ASO についても、値として保管できる range_t 型変数は 1 つのみです。 同じ ASO について 2 つの異なる型の range_t 変数型を指定すると、qrange は失敗します。
例:
qrange(aso[“read”], T1,time_spent); // Correct syntax. qrange(aso[“read”], T2,time_spent); // Error. Two different range_t types // cannot be used for the same ASO.値タイプが range_t の連想配列の
quantize関数とlquantize関数は、頻度と範囲数の視覚的な量子化を示します。 - 文字列範囲の表示では、特定の 1 スロットについて最大 40 文字 (コンマを含む) を表示できます。 スロット内のストリングが 40 文字を超える場合、ストリング範囲は切り捨てられ、最後の 3 文字がドット (...) として印刷されます。.
範囲データ型と qrange ルーチンの例:
@@BEGIN
{
__thread start ;
range_t T1;
set_range(T1, LINEAR, 0, 150, 10) ;
}
@@syscall :$__CPID :read :entry
{
thread :tracing = 1 ;
start = timestamp() ;
}
@@syscall :$__CPID :read :exit
when(thread :tracing == 1)
{
__auto long time_spent;
currtime = timestamp() ;
time_spent = diff_time(start, currtime, MICROSECONDS);
qrange(aso[“read”], T1, time_spent);
}
@@END
{
print(aso);
quantize(aso);
}
この例で期待される出力:
Key Value
Read Range count
0-11 4
10-20 6
60-70 7
Others 32
Key Value
Read Range count
0-10 4 ===
10-20 6 ====
60-70 7 =====
Others 32 ================