系统性能计数器的实例名称是否已本地化

时间:2011-08-25 07:47:23

标签: windows localization performancecounter performance pdh

Windows中的性能计数器名称是本地化的,因此例如计数器\Processor(_Total)\% Processor Time在其他语言版本的Windows中被称为其他名称。这意味着为了找到正确的名称,必须首先找到计数器的索引,然后使用PdhLookupPerfNameByIndex函数获取本地化名称(如果应支持Windows XP,则使用PdhAddEnglishCounter

这对于上面的计数器路径的性能对象(Processor)和计数器(% Processor Time)部分都有好处,但是实例名称(_Total)呢?我在注册表中找不到这个字符串,所以我认为它是由提供信息的任何系统组件提供的。

在不同语言版本的Windows中,系统提供的性能计数器的实例名称是否保证相同?

如果没有,我该如何确定哪个实例与_Total个实例相对应?

2 个答案:

答案 0 :(得分:2)

根据this support KB,只有对象和计数器具有友好名称:

  

但是,实例在每种语言中都没有用户友好名称。

因此,这使我相信给定计数器的实例名称是动态地(例如,用于处理的ProcessId)或静态地(例如,硬编码的)获得的。当然,没有什么能阻止某人在英语版本中硬编码“_Total”以及德语版本中的其他内容,尽管通常的做法是将语言内容限制在注册表中并通过以下方式处理对象和计数器索引和动态或静态名称的实例。我认为微软一直使用“_Total”,就像我在一些外语安装上看到的那样。

答案 1 :(得分:1)

卢克是对的。为了获得Processor(_Total)\%Processor Time的本地化版本,我们必须获取路径“Processor”和“%Processor Time”的每个组件的本地化名称,并且'(_Total)'是常量。操作系统版本的索引可能不同,因此您必须在每次运行时发现它们。 win32pyutil 模块包含将加载英语到索引映射但保留它的方法,并且如果你只需要它一次就不小,那么这可能是一个内存浪费。我们使用以下内容:

def _find_pdh_counter_localized_name(eng_names,machine_name=None):
    '''
    Create a map of english names to indexes. We then lookup the english 
    name in the map to get the localized name.

    Shamefully lifted from win32pdhutil, only this one uses a transient map 
    instead of a persistent one.

    Will throw KeyError if a name is asked for that is not in the list.
    '''
    import win32api, win32con
    counter_reg_value = win32api.RegQueryValueEx(
        win32con.HKEY_PERFORMANCE_DATA, "Counter 009"
    )
    counter_list = counter_reg_value[0]
    eng_map={}
    for i in range(0, len(counter_list) - 1, 2):
        try:
            counter_id = int(counter_list[i])
        except ValueError:
            continue
        eng_map[counter_list[i+1].lower()] = counter_id
    ret = [] 

    for name in eng_names:
        ret.append(win32pdh.LookupPerfNameByIndex(
            machine_name, eng_map[name.lower()])
        )
    del eng_map
    return tuple(ret)

构建计数器名称:

    names = _find_pdh_counter_localized_name(['processor','% processor time'])
    counter_name = r'\%s(_Total)\%s' % names

产生所需的值。例如,意大利语中的“\ Processore(_Total)\%Tempo Processore”。

相关问题