Смущены результатами производительности профилировщика 32-битные против 64-битных

У меня есть приложение, которое вызывает 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.

Я перегружен погоней за документацией … запутываю себя … и в конечном итоге угадывание при изменениях кода, которые могут иметь или не иметь никакого значения.

Надеясь на руководство.

1

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector