我正在使用性能监视器来收集计数器数据并将其保存到数据库中。这是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?
答案 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 --> 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位字段)
让我们来看看,为什么低阶位在右边,高阶在左边:
Binary就像阿拉伯数字一样。在阿拉伯数字中,数字为:
123456
意味着一万二千三百五十六。十万是最重要的部分(因为我们将这缩短为“超过十万美元”,而不是“超过6美元”),六是我们最自由放弃的部分。所以我们可以说数字是:
123是包含高位的值,456是包含低位的值。在这里,我们将乘以10 ^ 3将它们加在一起(这是一个数学事实,而不是猜测,所以请相信我),因为它看起来像这样:
123
456
所以二进制文件同样适用:
//for reference, this is 32 bits
12345678901234567890123456789012
000000000000000000000FirstValueB
000000000000000000000FirstValueA
将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);