范围和存储区数据类型
范围和存储区数据类型
Vue 中的范围数据类型设计为处理某些已定义范围的数据点的分布。 定义为范围数据类型的变量的每个范围将显示相应范围值内的元素的计数。 范围数据类型将支持整数与字符串类型的范围。 整数范围的范围值的分布可以是 2 次幂分布,也可以是线性分布。 以下是范围值的线性分布和 2 次幂分布的示例:
线性分布:
范围 | 计数 |
---|---|
0 - 5 | 2 |
5 - 10 | 4 |
10 - 15 | 1 |
其他 | 20 |
2 次幂分布:
范围 | 计数 |
---|---|
1 - 2 | 2 |
2 - 4 | 9 |
4 - 8 | 2005 |
8 - 16 | 4 |
16 - 32 | 1999 |
32 - 64 | 7 |
其他 | 5 |
先前的分布表明元素计数大于或等于范围值的下边界,且小于范围值的上边界。 例如,在 2 次幂分布中,从 4 开始且小于 8 的数据计数是 2005。 不属于已定义范围的值的计数显示在“其他”范围下。
字符串范围的示例
例如:
范围 | 计数 |
---|---|
Read、write 和 open | 87 |
Close、foo1 | 3 |
foo2 | 1 |
其他 | 51 |
在前面的示例中,分布表明范围值内发生的特定字符串的次数。 在本示例中,read、write 和 open 共计调用 87 次。
范围数据类型的声明和初始化:
可以使用 range_t
关键字来声明范围数据类型。 例如,Vue 脚本中的以下声明定义两个范围数据类型变量:
range_t T1, T2; // T1 and T2 are of Range data type variables.
set_range
和 add_range
例程用于初始化任何特定范围数据类型变量的整数范围和字符串范围。
初始化整数范围数据类型:将使用 set_range
例程来初始化整数范围。 范围值的线性分布和 2 次幂分布的 set_range
的语法将会不同。 线性分布的 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
例程可初始化字符串范围数据类型。
语法:
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 的单个时段。 同一 range_t
数据 T1 上的另一个 add_range 将字符串添加到下一个槽。
add_range(T1, “close”, “func1”, “func2”);
此例程会将字符串 close
、func1
和 func2
添加到下一个时段中的 range_t
数据 T1。
- 只能在 @@BEGIN 子句中声明 range_t 数据类型。
- 只能在 @@BEGIN 子句内部使用 set_range 例程初始化。
- 范围值为整数的范围数据类型只能初始化一次。 同一个变量不能初始化两次。
例如:
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());
在此示例中, qrange
例程查找作为第三个自变量传递的函数的槽号,并为对应于 function usage 键的 aso
关联数组递增该槽的计数。
- 对于任何 ASO,只能将一个 range_t 类型变量存储为值。 对于同一个 ASO,将 qrange 用于两种不同类型的 range_t 变量类型会失败。
例如:
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
函数显示频率的可视量化和范围的计数。 - 显示字符串范围时,最多可以为特定时段显示 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 ================