Смущены результатами производительности профилировщика 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.

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

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

0 ответов

Другие вопросы по тегам