问题 EASTL表现


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


4706
2018-03-03 18:19


起源

你为什么标记C?编译器自己的标准库可以专门针对该编译器进行优化。但是,我不确定它是否应该达到那个数量级。什么是v100平台工具集? - Neil Kirk
我不确定我会信任 clock 对于计时,但当差异很大时应该没问题。值得尝试使用标准字符串的EASTL向量,反之亦然,以缩小问题范围。 - Mark Ransom
@MarkRansom:嗯。 EA的标准字符串向量比标准向量快,但字符串也不应该更快? - CsOkemf
该 std::vector 实施可以使用分配策略,该策略保留比请求更多的空间 - 导致更少 new 调用。此外, std::string 可能会实施 短串优化。 - Brett Hale
您可能想尝试以下某些操作:1)切换基准测试的顺序 eastl 对象和 std 查看第一个循环是否以某种方式“启动”缓存或内存的对象; 2)在基准测试结束时,从每个向量打印信息(大小,某些元素的内容等)以尝试确保操作不会因为优化器识别出操作而被省略 vec_Xxxx 实际上没有使用对象; 3)检查或逐步执行汇编代码,看看是否有任何事情跳出来作为理由; 4)让我们确切地知道正在使用哪些编译器选项来构建 - Michael Burr


答案:


当我在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

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


11
2018-03-04 02:07



嗯,你能分享整个解决方案吗?也许我有不同的编译器设置。 - CsOkemf
git clone https://github.com/mburr/eastl-test.git 然后打开VS2010解决方案 eastl-test\vs2010-test\eastl-test\eastl-test.sln。您可能还想阅读 eastl-test\vs2010-test\README-vs2010-test.txt - Michael Burr
非常感谢,现在我确定我的设置有问题。现在我收到了你的结果。 - CsOkemf
我有兴趣知道项目的不同之处在于,如果你跟踪过这种情况,那么你总能看到这种行为。 - Michael Burr
@MichaelBurr可能是整个程序优化,内联任何或配置文件引导优化 - Luc Bloom