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));
}
结果是:
- EA 0.759000
- 标准 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
现在很明显,当基准测试在调试器下 运行 时,数量级差异可能是由于调试堆花费大量时间跟踪字符串内存分配。
今天我下载并创建了一个 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));
}
结果是:
- EA 0.759000
- 标准 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
现在很明显,当基准测试在调试器下 运行 时,数量级差异可能是由于调试堆花费大量时间跟踪字符串内存分配。