2

パフォーマンスモニターを使用してカウンターデータを収集し、DBに保存しています。これは、msdnhttp: //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をどのように組み合わせてSQLServerでFirstValueを取得しますか?

4

2 に答える 2

3

つまり、彼らが言っているのは、次のように2つを混ぜ合わせる必要があるということです。

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

それが言っているのは、2つを組み合わせる必要があるということです。Aが低次、Bが高次と書いてあります。

http://en.wikipedia.org/wiki/Least_significant_bitlow 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つのバイナリ文字列ではなく、2つの整数です。したがって、左側の値に2 ** 32を掛けて、右側の値に追加する必要があります。(ちなみに、これは64ビットフィールドです)

なぜ下位ビットが右側にあり、上位ビットが左側にあるのかを調べてみましょう。

2進数は、アラビア数字と同じように記述されます。アラビア数字では、数字は次のとおりです。

123456

百二十三千、四百五十六を意味します。10万が最も重要な部分であり(これを「6ドルをはるかに超える」ではなく「10万ドルをわずかに超える」に短縮するため)、6は最も自由にドロップする部分です。したがって、その数は次のようになります。

123は上位ビットを含む値であり、456は下位ビットを含む値です。ここでは、10 ^ 3を掛けて、それらを足し合わせます(これは数学的な事実であり、推測ではないので、これを信頼してください)。これは次のようになります。

 123
    456

したがって、同じことがバイナリでも機能します。

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

tl; dr:

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 に答える