字符串拷贝函数memcpy()、strncpy()和snprintf()性能之比较
问题:
函数memcpy(dest, src, sizeof(dest))、strncpy(dest, src, sizeof(dest))和snprintf(dest, sizeof(dest), "%s", src)都可以将src字符串中的内容拷贝到dest字符串中。
哪一种方式效率最高呢?
就是说,哪种方式性能最好呢?
解决办法:
1. 建立三个文件test_memcpy.c,test_strncpy.c和test_snprintf.c:
文件test_memcpy.c:
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, 0, sizeof(dest));len = strlen(src);len = sizeof(dest) - 1 > len? len: sizeof(dest) -1;memcpy(dest, src, len);dest[len] = '\0';}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, 0, sizeof(dest));strncpy(dest, src, 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, 0, sizeof(dest));snprintf(dest, sizeof(dest), "%s", 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_strncpyreal 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_strncpyreal 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_strncpyreal 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()更高效。
转载于:https://www.cnblogs.com/java20130726/archive/2013/03/29/3218503.html
字符串拷贝函数memcpy()、strncpy()和snprintf()性能之比较相关推荐
- 字符串复制函数strncpy()和内存拷贝函数memcpy()
#include<string.h> char *strncpy(char *dest, const char *src, unsigned long n); 功能是将指针变量src所指向 ...
- 【C语言】字符串拷贝函数(strcpy)与内存拷贝函数的不同及内存拷贝函数(memcpy)的模拟实现
目录 字符串拷贝函数(strcpy) 函数原型 应用实例 我们将一个存放"abcdefg"的字符数组arr的内容拷贝到字符数组brr之中. 缺点 内存拷贝函数(memcpy) 函数 ...
- 内存拷贝函数memcpy相关解析(C语言)
memcpy方法解析 内存拷贝函数的一般用法 memcpy()函数的拷贝原理分析 以深浅拷贝为例分析memcpy的拷贝原理 用memcpy()函数与不用memcpy()函数进行拷贝数据的区分 内存拷贝 ...
- 实现一个高效率的内存拷贝函数memcpy
内存拷贝函数memcpy memcpy是memory copy的缩写,意为内存复制,在写C语言程序的时候,我们常常会用到它.它的函原型如下: void *memcpy(void *dest, cons ...
- 【C 语言】字符串拷贝 ( 函数形参使用推荐方法 | 凡是涉及 修改指针指向 的操作一律创建新的 指针变量 执行 | 引入 辅助 局部 指针变量 )
文章目录 一.函数形参使用推荐方法 二.完整代码示例 一.函数形参使用推荐方法 在函数中 , 形参 中的 指针变量 , 不建议直接使用 ; 推荐 在 函数中 , 定义 局部 指针变量 , 接收 形参中 ...
- 字符串拷贝函数:strcpy的详解及模拟实现
字符串拷贝函数:strcpy的详解及模拟实现!!! 对于字符串拷贝函数,之前在学习字符串时候,就已经学习过,但那只是片面的学习了一下,并没有经过系统的分析!只是大概的学习了一下!在关键的地方有时候还不 ...
- 字符串拷贝函数strdup()
char *strdup(const char *s); 注: strdup()函数是c语言中常用的一种字符串拷贝库函数,一般和free()函数成对出现. 字符串拷贝函数strdup()内部实现如下: ...
- 字符串拷贝函数Strcpy的实现
实现字符串拷贝函数时,一定要分清楚源头的字符串和目的字符串,两者的位置不同,首先是方法1: #include<stdio.h> #include<assert.h> void ...
- C语言学习笔记---数据拷贝函数memcpy()和memmove()函数
在C语言中拷贝字符串的时候通常可以使用strcpy()函数和strncpy()函数,这两个函数是专门针对字符串拷贝的.如果想要拷贝其他类型数组的话,可以使用memcpy()和memmove()函数 ...
最新文章
- 在应用程序中替换Linux中Glibc的malloc的四种方法
- mysql blob key length_mysql – 没有密钥长度的密钥规范中使用的BLOB / TEXT列’bestilling’...
- wxWidgets:wxProcessEvent类用法
- mysql如何explan优化sql_《MySQL数据库》MySQL 优化SQL(explain)
- mysql中约束_【MySQL】:MySQL中四大约束
- 增强服务器安全性能,加强Linux服务器安全的20项建议
- Linux系统查看系统硬件,linux怎么查看系统硬件信息
- 黑马程序员--C语言基础之--sizeof()运算符的使用以及注意
- 图像处理:透镜畸变及校正模型
- 树莓派 zero cpu:elpida b4432bbpa-1d
- python小白逆袭大佬_Python小白逆袭大神心得
- 数据结构-01-链表数据结构之单链表
- webapi上传示例及调用方式(netframwork)
- mac修改eclipse的内存配置
- java制作进度条,Java制作进度条
- 基于CAD等高线的流域边界绘制
- 什么叫工业4.0,这篇接地气的文章终于讲懂了
- 智能电话机器人(AI语音机器人)是什么
- 实验7-4 身份证号码最后一位
- 如何搭建一套免费开源的微信群机器人问答系统?
热门文章
- python制作工资计算器-Python计算个人所得税
- python编程100例画图-Python练习实例56 | 画图,学用circle画圆形
- python中文编辑器推荐-python文本编辑器是什么
- pythonurllib模块-Python urllib模块 网络资源访问安装下载
- python画三维立体图-python之画三维图像
- python3.7.4-Python3.7.4入门-3函数
- python语言入门w-Python 基础教程
- python处理数据的优势-选择python进行数据分析的理由和优势
- 风云编程python-python网络编程(一)
- 合肥python培训-合肥Python测试开发全栈核心课程