字符串拷贝函数memcpy和strncpy以及snprintf 的性能比较
发布时间:2020-12-15 05:42:49 所属栏目:百科 来源:网络整理
导读:问题: 函数memcpy(dest,src,sizeof(dest))、strncpy(dest,sizeof(dest))和snprintf(dest,sizeof(dest),"%s",src)都可以将src字符串中的内容拷贝到dest字符串中。 哪一种方式效率最高呢? 就是说,哪种方式性能最好呢? 解决办法: 1. 建立三个文件test_memc
问题: 复制代码 代码如下: david@u1110-hp:~/wrk/tmp/cstring$ cat test_memcpy.c #include <string.h> int main(){ char src[] = "1234567890"; char dest[2048]; int len = 0; for(int i = 0; i < 10000000; ++i){ memset(dest,sizeof(dest)); len = strlen(src); len = sizeof(dest) - 1 > len? len: sizeof(dest) -1; memcpy(dest,len); dest[len] = ' '; } return 0; } 文件test_strncpy.c: 复制代码 代码如下: #include <string.h> int main() { char src[] = "1234567890"; char dest[2048]; int len = 0; for(int i = 0; i < 10000000; ++i) { memset(dest,sizeof(dest)); strncpy(dest,sizeof(dest)); } return 0; } 文件test_snprintf.c: 复制代码 代码如下: #include <stdio.h> #include <string.h> int main() { char src[] = "1234567890"; char dest[2048]; int len = 0; for(int i = 0; i < 10000000; ++i) { memset(dest,sizeof(dest)); snprintf(dest,src); } return 0; } 2. 分别编译三个文件: 复制代码 代码如下: david@u1110-hp:~/wrk/tmp/cstring$ gcc -std=c99 -o test_memcpy test_memcpy.c david@u1110-hp:~/wrk/tmp/cstring$ gcc -std=c99 -o test_strncpy test_strncpy.c david@u1110-hp:~/wrk/tmp/cstring$ gcc -std=c99 -o test_snprintf test_snprintf.c 3. 没有优化的情况下不同函数消耗时间对比: 复制代码 代码如下: david@u1110-hp:~/wrk/tmp/cstring$ time ./test_strncpy real 0m16.472s user 0m16.309s sys 0m0.036s david@u1110-hp:~/wrk/tmp/cstring$ time ./test_snprintf real 0m6.106s user 0m6.100s sys 0m0.000s david@u1110-hp:~/wrk/tmp/cstring$ time ./test_memcpy real 0m4.179s user 0m4.144s sys 0m0.000s david@u1110-hp:~/wrk/tmp/cstring$ 从上面运行结果可以看出:没有任何优化的情况下,memcpy()和strncpy()性能相差4倍,snprintf()和strncpy()性能相差约2.5倍。 4.采用O3优化情况下不同函数消耗时间对比: 复制代码 代码如下: david@u1110-hp:~/wrk/tmp/cstring$ gcc -std=c99 -O3 -o test_snprintf test_snprintf.c david@u1110-hp:~/wrk/tmp/cstring$ gcc -std=c99 -O3 -o test_strncpy test_strncpy.c david@u1110-hp:~/wrk/tmp/cstring$ gcc -std=c99 -O3 -o test_memcpy test_memcpy.c david@u1110-hp:~/wrk/tmp/cstring$ 复制代码 代码如下: david@u1110-hp:~/wrk/tmp/cstring$ time ./test_strncpy real 0m16.178s user 0m16.161s sys 0m0.000s david@u1110-hp:~/wrk/tmp/cstring$ time ./test_snprintf real 0m6.242s user 0m6.032s sys 0m0.056s david@u1110-hp:~/wrk/tmp/cstring$ time ./test_memcpy real 0m3.567s user 0m3.436s sys 0m0.012s david@u1110-hp:~/wrk/tmp/cstring$ 从上面运行结果可以看出:采用O3优化后,memcpy()和strncpy()性能相差近5倍,snprintf()和strncpy()性能相差基本不变约2.5倍。 5. 性能对比结论: 在需要用到字符串拷贝函数的时候,永远不要使用strncpy(),无论什么时候都用snprintf()来代替,而memcpy()是性能更好的实现方式。 strlen+memcpy也是linux内核的实现方式。 6. 意外收获结论: 将上述三个文件中的memset()改为用bzero()来实现数组的清零操作。 使用O3来进行优化,三个函数的耗时时间如下: 复制代码 代码如下: david@u1110-hp:~/wrk/tmp/cstring$ time ./test_strncpy real 0m14.395s user 0m13.929s sys 0m0.092s david@u1110-hp:~/wrk/tmp/cstring$ time ./test_snprintf real 0m3.785s user 0m3.772s sys 0m0.000s david@u1110-hp:~/wrk/tmp/cstring$ time ./test_memcpy real 0m1.241s user 0m1.236s sys 0m0.004s david@u1110-hp:~/wrk/tmp/cstring$ 结论:仅仅换了一个清零函数,使得memcpy()和strncpy()的性能差别达到约12倍,而snprintf()和strncpy()的性能差别也达到约4倍。 就清零操作来说,bzero()远比memset()更高效。 您可能感兴趣的文章:
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- Swift开发教程--如何使UITableViewController背景透明
- E0144"const char *" 类型的值不能用于初始化 "
- NAudio fft结果给出所有频率C#的强度
- 如何设置SKLabelNode的字体大小以适合固定大小(Swift)
- ruby-on-rails – 文档管理系统:什么用作存储后端(docs内容
- objective-c – 使用不兼容类型’id’的表达式初始化’doub
- ruby-on-rails – 资产管道缓存CSS?
- SPI_FLASH 操作
- c# – 无法强制转换为我的自定义ConfigurationSection
- 超时 – 使用AJAX时出现Cloudflare 524错误