У меня есть приложение, которое вызывает DLL, которая, в свою очередь, может звонить в другую DLL.
Моя проблема заключается в снижении производительности, когда эти двоичные файлы являются 64-разрядными по сравнению с 32-разрядными.
Я профилировал (AQtime v8.24), используя счетчики Elapsed Time и CPU Cache Misses, и я не понимаю результаты таким образом, который помогает мне знать, что делать.
Поэтому я написал тестовый .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-битная версия была на 36% быстрее, чем 32-битная. Большой! Хотя я не понимаю, ПОЧЕМУ это изменение имело такое значение.
Но согласно 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.
Я перегружен погоней за документацией … запутываю себя … и в конечном итоге угадывание при изменениях кода, которые могут иметь или не иметь никакого значения.
Надеясь на руководство.
Задача ещё не решена.