15

今天我下载并创建了一个 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 平台工具集进行编译。

4

1 回答 1

19

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

EA       0.063000
Standard 0.073000

但是,当我在 VS 调试器下运行相同的发布版本时,结果发生了巨大变化:

EA       1.293000
Standard 0.080000

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

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


更新(2015 年 3 月 4 日):

影响结果的另一个细节是所涉及的字符串的长度。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

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

于 2015-03-04T02:07:10.173 回答