none
Счётчики производительности и язык системы RRS feed

  • Вопрос

  • Здравствуйте, товарищи.

    Возникла задачка мониторить системные счётчики
    производительности.

    Создаю счётчик для чтения, указывая его имя, имя категории и экземпляр приложения. Как бы всё работает. Иду на другой компьютер. А там по недосмотру русскоязычная винда стоит и счётчики называются совсем по другому . Вот за кого о ни нас держат ?!

    Соответственно нужно сначала смотреть язык системы, затем уже просить счётчики производительности с соответствующими их названиями на русском языке. Идём дальше. Если моя программа будет запущена на компьютере моего вьетнамского коллеги, то я уже не знаю, как нужный мне счётчик называется на его волшебном языке с такими красивыми буковками, которых почему-то нет на моей клавиатуре.

    Теперь собственно вопрос.

    Существует ли универсальный способ выпросить у системы счётчик производительности, не зависящий от языка интерфейса операционки?

    Спасибо.

    14 июня 2012 г. 19:33

Ответы

  • В общем как я немного спустя понял вы используете контрол PerformanceCounter для получения данных из нужного счетчика. Дело в том, что когда в свойствах PerformanceCounter вы открываете пункты CategoryName и CounterName данные о доступных счетчиках берутся из вот этого ключа реестра "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib\CurrentLanguage\Counter". Только вот какая штука все названия занесены в этот ключ в виде хитрой строки с цифровыми идентификаторами.

    Тут 2 варианта действий. Если вам нужны конкретные счетчики, то вы можете вручную вычислить их идентификаторы и задавать имя счетчика не в свойствах а в коде, предварительно выделив имя из реестра по идентификатору (можно с помощью регулярных выражений). Второй вариант это понять (или найти) алгоритм по которому сам PerformanceCounter выделяет из этого ключа реестра категории и имена счетчиков и получить универсальный способ создания счетчиков на компьютерах с любой локализацией.


    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    15 июня 2012 г. 5:16
    Отвечающий

Все ответы

  • А как вы собственно запрашиваете эти счетчики сейчас?

    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    15 июня 2012 г. 4:45
    Отвечающий
  • В общем как я немного спустя понял вы используете контрол PerformanceCounter для получения данных из нужного счетчика. Дело в том, что когда в свойствах PerformanceCounter вы открываете пункты CategoryName и CounterName данные о доступных счетчиках берутся из вот этого ключа реестра "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib\CurrentLanguage\Counter". Только вот какая штука все названия занесены в этот ключ в виде хитрой строки с цифровыми идентификаторами.

    Тут 2 варианта действий. Если вам нужны конкретные счетчики, то вы можете вручную вычислить их идентификаторы и задавать имя счетчика не в свойствах а в коде, предварительно выделив имя из реестра по идентификатору (можно с помощью регулярных выражений). Второй вариант это понять (или найти) алгоритм по которому сам PerformanceCounter выделяет из этого ключа реестра категории и имена счетчиков и получить универсальный способ создания счетчиков на компьютерах с любой локализацией.


    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    15 июня 2012 г. 5:16
    Отвечающий
  • Сейчас я запрашиваю счётчики вот так:

    PerformanceCounter pc = new PerformanceCounter(categoryName, counterName, instanceName);

    Для этого надо знать имена все эти.
    Ну или тоже получаю список счётчиков из категорий, чтобы записать в настройку, какие счётчики потом пользовать.

    Спасибо за информацию о ключе реестра, там действительно большой текст с перечнем категорий и их счётчиков, но только некоторых. Наверное тех, которые с системой пришли. А вот счётчиков CLR там почему-то нет...

    На картинке зелёным показаны счётчики, которые нашлись в той строке, а синим выделены счётчики, которых там не нашлось. А они тоже, к сожалению, от языка зависят.

    Зато в соседнем разделе реестра нашлись нужные счётчики на английском языке. Странно, что они не попали в русскоязычный список. Как получить их локализованный эквивалент непонятно...

    Буду искать способы получить сведения о счётчиках по их номерам, полученным из этих списков..


    15 июня 2012 г. 14:15
  • Ха. А как оказалось строки из ветки 019 и CurrentLanguage разные. Вот в 019 все это есть. Значит вам нужно определять язык системы где запускается винда и брать значения реестра по коду локализации.

    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    15 июня 2012 г. 14:23
    Отвечающий
  • Да, только беда в том, что локализованный список содержит не все наименования счётчиков.

    Есть счётчики, которые можно вычерпать из категорий с русскими названиями, не перечисленные в русскоязычном ключе реестра.

    15 июня 2012 г. 14:29
  • Ну а если скомпоновать CurrentLanguage и ветку с номером текущей локализации, то получается полный список?

    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    15 июня 2012 г. 14:31
    Отвечающий
  • Получается!

    Я и не предполагал, что они могут дополнять друг друга. Очень странное решение. Типа, в один всё не поместилось? А если бы в два не поместилось...

    Спасибо, решение найдено!


    from msdn

    15 июня 2012 г. 14:37
  • Получается!

    Я и не предполагал, что они могут дополнять друг друга. Очень странное решение. Типа, в один всё не поместилось? А если бы в два не поместилось...

    Спасибо, решение найдено!


    from msdn

    Да нет. Думаю дело не в "поместилось" а в том что счетчики могут быть созданы разными разработчиками и видимо стандартные с нуля идут в CurrentLanguage, а те что идет вместе .Net и другими продуктами ставятся только в ветку с номером локализации.

    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    15 июня 2012 г. 14:40
    Отвечающий
  • Логично.

    15 июня 2012 г. 15:05