【发布时间】:2011-01-11 12:54:57
【问题描述】:
我今天正在玩一些计时代码,发现当将字符串文字分配给 std::string 时,它的速度提高了大约 10%(使用较短的 12 字符字符串,因此对于大字符串可能会有更大的差异)使用已知长度的文字(使用 sizeof 运算符)而不是这样做。 (只用VC9编译器测试过,所以我猜其他编译器可能会更好)。
std::string a("Hello World!");
std::string b("Hello World!", sizeof("Hello World!");//10% faster in my tests
现在我怀疑的原因是它必须调用 strlen(VC9 进入汇编程序,这不是我的强项,所以我不能 100% 确定)来获取字符串长度,然后与第二种情况相同无论如何。
考虑到 std::string 已经存在了多长时间,以及第一种情况在现实世界的程序中有多常见(特别是如果您包含 +、=、+= 等运算符和等效方法),它为什么没有优化第一个案例变成第二个?如果它是一个 std::basic_string 对象和一个字面量,就好像它像 b 一样编写,这似乎也很简单?
【问题讨论】:
-
你是如何测试它的?启用优化?确定你的测试没有缺陷?
-
测试和关于更长字符串的假设听起来有缺陷。准备好被 Neil Butterworth 敲打。
-
它进行了全面优化,包括启用链接时间生成和内在功能。在这两种情况下,它都是完全相同的一段代码,我只是将字符串从 a 初始化为 b 的方式进行了更改,然后重新编译。我运行了几次,所以我认为任何其他因素都不太可能对其产生如此大的影响。
-
嗯,您需要将执行时间提高到可以可靠测量的值的循环在哪里?如前所述,代码执行将由 CPU 缓存效应主导。
-
在每种情况下都在约 30 秒的时间内进行了测量,尽管来自测试的确切数字并不是真正重要的 IMO。检查组件将是显示它没有优化它的更好方法,但正如我所说,这不是我的强项,所以我永远无法找到反汇编的相关位,并且证明的机会更少它在做什么或不做什么。
标签: c++ visual-c++ string compiler-optimization stdstring