我有一个调用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的调用。
我通过追逐文档而感到不知所措......让自己感到困惑......最终猜测代码更改可能会或可能不会产生任何影响。
希望获得指导。