2

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

基于 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?

4

2 回答 2

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 --> right, 和high 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 位字段)

让我们检查一下,为什么低位在右边而高位在左边:

二进制就像阿拉伯数字一样书写。在阿拉伯数字中,数字:

123456

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

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

 123
    456

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

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

tl;博士:

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

于 2012-01-09T21:14:59.723 回答
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);
于 2016-06-18T11:44:26.050 回答