对于32位与64位的分析器性能结果相混淆

时间:2015-09-01 15:13:48

标签: c++ performance dll profiler aqtime

我有一个调用DLL的应用程序,而可能会调用另一个DLL。

当这些二进制文件是64位而不是32位时,我的问题是性能下降。

我一直在使用Elapsed Time和CPU Cache Misses计数器进行分析(AQtime v8.24),但我不了解结果,这有助于我知道该怎么做。

所以我编写了一个测试.exe,它调用了一个测试DLL,简化了代码。最初,这些工具的性能下降(64位版本比32位慢四倍),CPU Cache Misses测试指向了这个例程:

const char* TSimple::get_schema_name( const int schema_number )
{
    char* t_ptr = 0;
    int t_idx;
    for (t_idx = 0; t_idx < 153; t_idx++)
    {
        // THIS ASSIGNMENT IS WHAT WAS SHOWN TO BE A PROBLEM
        bogus_SchemaDef t_def = schema_list[t_idx];
        if (t_def.SchemaNumber == schema_number)
        {
            return (const char*)schema_list[t_idx].SchemaName;
            break;
        }
    }

    return t_ptr;
}

// THIS IS THE bogus_SchemaDef struct:
typedef struct
{
    int SchemaNumber;
    char SchemaName[100];
    char SiteList[100];
} bogus_SchemaDef;

// THIS IS THE schema_list ARRAY (portion):
static bogus_SchemaDef schema_list[] = {
{ 1, "LipUpper", "C000;C003" },
{ 153, "IllDefinedOther", "C420-C424;C760-C765;C767-C768;C770-C775;C778-C779;C809" }
};

所以我将代码更改为此(取消了对结构实例的赋值):

const char* TSimple::get_schema_name( const int schema_number )
{
    char* t_ptr = 0;
    int t_idx;
    for (t_idx = 0; t_idx < 153; t_idx++)
    {
        //bogus_SchemaDef t_def = schema_list[t_idx];
        //if (t_def.SchemaNumber == schema_number)
        if (schema_list[t_idx].SchemaNumber == schema_number)
        {
            return (const char*)schema_list[t_idx].SchemaName;
            break;
        }
    }

    return t_ptr;
}

重新运行测试,这次64位版本比32位快36%。大!虽然我不明白为什么这种变化会产生如此大的影响。

但根据AQtime,64位版本的性能仍然比32位版本差。

CPU Cache Misses/% Misses
32-bit: 25.79%
64-bit: 83.34%

Elapsed Time/% Time
32-bit: 10.99%
64-bit: 33.95%

我真的需要了解AQtime告诉我的是什么,因为当我将这个修改过的测试DLL插入到我的应用程序调用我的DLL然后调用此DLL的环境中时,整体性能会降低30-40%。

我应该注意,当我测试我的应用程序+ DLL,我调用第二个DLL时,64位版本的运行速度比32位版本快或快。所有内容都指向任何第二个DLL的调用。

我通过追逐文档而感到不知所措......让自己感到困惑......最终猜测代码更改可能会或可能不会产生任何影响。

希望获得指导。

0 个答案:

没有答案