Perfmon,如何结合使用FirstValueA和FirstValueB?

时间:2012-01-09 18:24:16

标签: sql-server performance performancecounter perfmon

我正在使用性能监视器来收集计数器数据并将其保存到数据库中。这是msdn http://msdn.microsoft.com/en-us/library/windows/desktop/aa371915(v=VS.85).aspx

中定义的DB结构

基于DB结构,这里是FirstValueA的定义:

  

将此32位值与FirstValueB的值组合以创建   PDH_RAW_COUNTER的FirstValue成员。 FirstValueA包含低值   订单位。

和FirstValueB:

  

将此32位值与FirstValueA的值组合以创建   PDH_RAW_COUNTER的FirstValue成员。 FirstValueB包含高   订单位。

应将FirstValueA和FirstValueB字段组合在一起以创建FirstValue,类似于SecondValue。

如何结合FirstValueA和FirstValueB来获取SQL Server中的FirstValue?

2 个答案:

答案 0 :(得分:3)

所以他们所说的是你需要将两者混为一谈,如下:

//for reference, this is 32 bits
12345678901234567890123456789012
000000000000000000000FirstValueA
000000000000000000000FirstValueB

它说的是我们需要将两者结合起来。它说A是低阶,B是高阶。

让我们参考维基百科http://en.wikipedia.org/wiki/Least_significant_bit,看看low order is on the --> righthigh order is on the <-- left

low order -> right
high order <- left

A -> right
B <- left

所以我们最终会得到(我们之前的例子)

//for reference, this is 32 bits
12345678901234567890123456789012
000000000000000000000FirstValueA
000000000000000000000FirstValueB

变为

//for reference, this is 32 bits
12345678901234567890123456789012
000000000000000000000FirstValueB000000000000000000000FirstValueA

现在,如果值看起来像这样,则不起作用:

//for reference, this is 32 bits
12345678901234567890123456789012
1001101100110100101011010001010100101000010110000101010011101010
//the above string of 1's and 0's is more correct for the example

你给出的不是两个二进制字符串,而是两个整数。因此,您必须将左侧值乘以2 ** 32并将其添加到正确的值。 (顺便说一句,这是64位字段)

让我们来看看,为什么低阶位在右边,高阶在左边:

Binary就像阿拉伯数字一样。在阿拉伯数字中,数字为:

123456

意味着一万二千三百五十六。十万是最重要的部分(因为我们将这缩短为“超过十万美元”,而不是“超过6美元”),六是我们最自由放弃的部分。所以我们可以说数字是:

123是包含高位的值,456是包含低位的值。在这里,我们将乘以10 ^ 3将它们加在一起(这是一个数学事实,而不是猜测,所以请相信我),因为它看起来像这样:

 123
    456

所以二进制文件同样适用:

//for reference, this is 32 bits
12345678901234567890123456789012
000000000000000000000FirstValueB
                                000000000000000000000FirstValueA

TL; DR:

将B乘以2 ^ 32并添加到A

答案 1 :(得分:0)

Console.WriteLine("{0} {1} {2} : {3} {4}", p.CategoryName, p.InstanceName, p.CounterName, p.RawValue, p.CounterType.GetHashCode());
float FirstValue = p.NextValue();
Console.WriteLine("FirstValueA :{0}", (ulong)FirstValue & 4294967295);
Console.WriteLine("FirstValueB :{0}", (ulong)FirstValue >> 32);
Console.WriteLine("SecondValueA :{0}", p.NextSample().TimeStamp & 4294967295);
Console.WriteLine("SecondValueB :{0}", p.NextSample().TimeStamp >> 32);