Производительность EASTL

Сегодня я загрузил и создал образец проекта внедрения Electronic Arts STL, и вектор EA выглядит намного медленнее для меня, чем стандарт. Я просто создал 2 вектора и загрузил их с 1 миллионом предметов:

void performance_test(void)
{
    clock_t start;
    clock_t end;


    // EA

    eastl::string strEA = "hello";
    eastl::vector<eastl::string> vec_EA;

    start = clock();
    for (size_t i = 0; i < 1000000; i++)
    {
        vec_EA.push_back(strEA);
    }

    end = clock();
    printf("EA       %f\n", (double(end - start) / 1000));

    // Standard

    std::string strStandard = "hello";
    std::vector<std::string> vec_Standard;

    start = clock();
    for (size_t i = 0; i < 1000000; i++)
    {
        vec_Standard.push_back(strStandard);
    }

    end = clock();
    printf("Standard %f\n", (double(end - start) / 1000));
}

И результаты:

  • EA 0.759000
  • Стандарт 0.064000

Итак, есть ли что-то, что я делаю неправильно, или я что-то пропустил? Образец был скомпилирован с помощью набора инструментов платформы v100.

Ответ 1

Когда я запускаю свой тест с выпуском сборки в VS 2010, я получаю результаты, похожие на то, на что можно надеяться:

EA       0.063000
Standard 0.073000

Однако, когда я запускаю ту же сборку релизов в отладчике VS, результаты резко меняются:

EA       1.293000
Standard 0.080000

И все это занимает еще больше (десятки секунд) для любой очистки объекта. Имейте в виду - это то же самое, что и сборка режима выпуска, а не сборка отладки.

Я не смотрел, почему EASTL сильно влияет на среду отладчика. Я предполагаю, что это имеет какое-то отношение к отладочной куче.


Обновление (4 марта 2015 года):

Другая деталь, которая влияет на результаты, - это длина задействованной строки. VS использует "оптимизацию коротких строк" ​​в std::string, что уменьшит количество распределений, которые возникают для строковых объектов, которые имеют значение, подобное "hello". Если вы измените инициализированное значение для строк, используемых в примере от "hello" до "hello - but not too short", вы получите результаты, похожие на следующие:

// release build, run outside of the debugger
EA       0.078000
Standard 0.113000

// release build, run under the debugger
EA       0.762000
Standard 1.414000

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