【发布时间】:2017-12-21 00:14:15
【问题描述】:
我有一个关于复制以 0 结尾的字符串的问题:
const char * str = "Hello World !";
size_t getSize = strlen(str);
char * temp = new char[getSize + 1];
...我知道我可以使用这个功能
memcpy(temp, str, getSize);
但我想使用我自己的复制功能,它有这样的作用
int Count = 0;
while (str[Count] != '\0') {
temp[Count] = str[Count];
Count++;
}
这两种方式都是正确的并且成功了。现在我想检查 1000 万次并为 memcpy 执行此操作
const char * str = "Hello World !";
size_t getSize = strlen(str);
for (size_t i = 0; i < 10000000; i++) {
char * temp = new char[getSize + 1];
memcpy(temp, str, getSize);
}
这是我自己的方式
const char * str = "Hello World !";
size_t getSize = strlen(str);
for (size_t i = 0; i < 10000000; i++) {
char * temp = new char[getSize + 1];
int Count = 0;
while (str[Count] != '\0') {
temp[Count] = str[Count];
Count++;
}
}
第一个过程在 420 毫秒 内完成,第二个过程在 650 毫秒 内完成 ... 为什么?这两种方式都是一样的!我想使用我自己的函数而不是 memcpy。有什么方法可以让我自己的方式更快(因为 memcpy 很快或者可能更快)? 我如何更新自己的方式(同时)以使其更快或与 memcpy 相等?
完整来源
int main() {
const char * str = "Hello world !";
size_t getSize = strlen(str);
auto start_t = chrono::high_resolution_clock::now();
for (size_t i = 0; i < 10000000; i++) {
char * temp = new char[getSize + 1];
memcpy(temp, str, getSize);
}
cout << chrono::duration_cast<chrono::milliseconds>(chrono::high_resolution_clock::now() - start_t).count() << " milliseconds\n";
start_t = chrono::high_resolution_clock::now();
for (size_t i = 0; i < 10000000; i++) {
char * temp = new char[getSize + 1];
int done = 0;
while (str[done] != '\0') {
temp[done] = str[done];
done++;
}
}
cout << chrono::duration_cast<chrono::milliseconds>(chrono::high_resolution_clock::now() - start_t).count() << " milliseconds\n";
return 0;
}
结果:
482 毫秒
654 毫秒
【问题讨论】:
-
如何衡量执行时间?
-
依赖于数组末尾的
'\0'字符,与memcpy()的作用不同。如果您只想处理这种情况,则使用strcpy()可能比滚动您自己的函数更好(实现中可能使用某些技巧使其比您的实现更快)。 -
为什么你认为你可以超越你的编译器标准库的创建者?
-
我很确定
new的成本比复制 14 个字节的成本相形见绌! -
@myOwnWays 许多编译器实现使用汇编语言来复制缓冲区。再说一次,你为什么认为你可以比业内一些最优秀的程序员更聪明?
标签: c++ string memcpy strcpy strdup