问题
C 风格的字符串操作是否真的比库string
类操作慢 5 倍,正如 C++ Primer,第 4 版让我相信的那样?
为什么这么问?
因为当我实际进行性能测试时,事实证明对于特定示例(书中使用的示例),C 风格的字符串大约快 50%。
设置
我正在阅读C++ Primer, 4th Edition,其中(第 138 页)列出了以下代码:
// C-style character string implementation
const char *pc = "a very long literal string";
const size_t len = strlen(pc +1); // space to allocate
// performance test on string allocation and copy
for (size_t ix = 0; ix != 1000000; ++ix) {
char *pc2 = new char[len + 1]; // allocate the space
strcpy(pc2, pc); // do the copy
if (strcmp(pc2, pc)) // use the new string
; // do nothing
delete [] pc2; // free the memory
}
// string implementation
string str("a very long literal string");
// performance test on string allocation and copy
for(int ix = 0; ix != 1000000; ++ix) {
string str2 = str; // do the copy, automatically allocated
if (str != str2) // use the new string
; // do nothing
} // str2 is automatically freed
现在请记住,我在第 2 行知道这一点strlen(pc +1)
,并且第一个for
使用size_t
但不为数组下标,所以它可能是int
,但这正是它在书中的写法。
当我测试这段代码(使用strlen(pc) + 1
,我认为这是有意的)时,我的结果是第一个块的执行速度比第二个块快约 50%,这导致C 风格的字符串比这个特定的库字符串类快例子。
但是,我敢打赌,由于本书(第 139 页)中与上述代码相关的内容,我遗漏了一些东西(可能很明显):
碰巧的是,平均而言,字符串类实现的执行速度比 C 风格的字符串函数快得多。我们超过五年的 PC 上的相对平均执行时间如下:
user 0.47 # string class
user 2.55 # C-style character string
那么是哪一个呢?我应该使用更长的字符串文字吗?也许是因为他们使用了 GNU C 编译器,而我使用了微软的编译器?是因为我有一台更快的电脑吗?
还是这本书只是错了?
编辑
Microsoft (R) 32 位 C/C++ 优化编译器版本 16.00.40219.01 用于 80x86