EASTL性能

EASTL performance

今天我下载并创建了一个 Electronic Arts STL 实施的示例项目,EA 的矢量对我来说看起来比标准的要慢得多。我刚刚创建了 2 个向量并上传了 100 万个项目:

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));
}

结果是:

  1. EA 0.759000
  2. 标准 0.064000

所以,我做错了什么或者我只是错过了什么?该示例已使用 v100 平台工具集编译。

当我 运行 使用 VS 2010 中的发布版本进行基准测试时,我得到的结果与人们可能希望的类似:

EA       0.063000
Standard 0.073000

然而,当我 运行 在 VS 调试器下构建相同的版本时,结果发生了巨大变化:

EA       1.293000
Standard 0.080000

而且无论发生什么对象清理,它都需要更长的时间(几十秒)。请记住 - 这是相同的发布模式构建,而不是调试构建。

我没有研究为什么 EASTL 受到调试器环境的影响如此严重。我认为它与调试堆有关。


更新(2015 年 3 月 4 日):

影响结果的另一个细节是涉及的字符串的长度。 VS 在 std::string 中使用 'short string optimization',这将减少为具有 "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

现在很明显,当基准测试在调试器下 运行 时,数量级差异可能是由于调试堆花费大量时间跟踪字符串内存分配。