Perfmon, как совместить Combine FirstValueA и FirstValueB? - PullRequest
2 голосов
/ 09 января 2012

Я использую монитор производительности, чтобы собрать данные счетчиков и сохранить их в БД. Вот структура БД, определенная в MSDN http://msdn.microsoft.com/en-us/library/windows/desktop/aa371915(v=VS.85).aspx

Основываясь на структуре БД, вот определение FirstValueA:

Объедините это 32-битное значение со значением FirstValueB, чтобы создать FirstValue член PDH_RAW_COUNTER. FirstValueA содержит минимум биты заказа.

И FirstValueB:

Объедините это 32-битное значение со значением FirstValueA, чтобы создать FirstValue член PDH_RAW_COUNTER. FirstValueB содержит максимум биты заказа.

Поля FirstValueA и FirstValueB должны быть объединены для создания FirstValue и аналогично SecondValue.

Как объединить FirstValueA и FirstValueB для получения FirstValue в SQL Server?

Ответы [ 2 ]

3 голосов
/ 10 января 2012

Так что они говорят, что вам нужно объединить два, как это:

//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

означает сто двадцать три тысячи четыреста пятьдесят шесть. Сто тысяч - это самая значительная часть (учитывая, что мы сократили бы ее до «чуть более ста тысяч долларов» вместо «намного более 6 долларов»), а шесть - это та часть, которую мы наиболее свободно отбрасываем. Таким образом, мы могли бы сказать, что число было:

123 - это значение, которое содержит биты старшего разряда, а 456 - это значение, которое содержит биты младшего разряда. Здесь мы умножим на 10 ^ 3, чтобы сложить их вместе (это математический факт, а не предположение, поэтому поверьте мне), потому что это будет выглядеть так:

 123
    456

и так же работает для двоичного файла:

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

ТЛ; др:

Умножьте B на 2 ^ 32 и добавьте к A

0 голосов
/ 18 июня 2016
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);
...