范围和存储区数据类型

范围和存储区数据类型

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_rangeadd_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”);

此例程会将字符串 readwriteopen 添加到 range_t 数据 T1 的单个时段。 同一 range_t 数据 T1 上的另一个 add_range 将字符串添加到下一个槽。

add_range(T1, “close”, “func1”, “func2”);

此例程会将字符串 closefunc1func2 添加到下一个时段中的 range_t 数据 T1。

注: range_t 范围数据类型是 Vue 的特殊数据类型,它只能用于存储为关联数组中的值。 对 range_t 数据类型执行任何其他运算(例如,算术、逻辑、按位和关系)都将失败且输出错误。
注: 本信息讨论 range_t 数据类型的各种使用和初始化例程。
  1. 只能在 @@BEGIN 子句中声明 range_t 数据类型。
  2. 只能在 @@BEGIN 子句内部使用 set_range 例程初始化。
  3. 范围值为整数的范围数据类型只能初始化一次。 同一个变量不能初始化两次。

    例如:

    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.
  4. minmaxstep 的参数是 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 关联数组递增该槽的计数。

注意:
  1. 对于任何 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 的关联数组的 quantizelquantize 函数显示频率的可视量化和范围的计数。

  2. 显示字符串范围时,最多可以为特定时段显示 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      ================