问题:

函数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()性能之比较相关推荐

  1. 字符串复制函数strncpy()和内存拷贝函数memcpy()

    #include<string.h> char *strncpy(char *dest, const char *src, unsigned long n); 功能是将指针变量src所指向 ...

  2. 【C语言】字符串拷贝函数(strcpy)与内存拷贝函数的不同及内存拷贝函数(memcpy)的模拟实现

    目录 字符串拷贝函数(strcpy) 函数原型 应用实例 我们将一个存放"abcdefg"的字符数组arr的内容拷贝到字符数组brr之中. 缺点 内存拷贝函数(memcpy) 函数 ...

  3. 内存拷贝函数memcpy相关解析(C语言)

    memcpy方法解析 内存拷贝函数的一般用法 memcpy()函数的拷贝原理分析 以深浅拷贝为例分析memcpy的拷贝原理 用memcpy()函数与不用memcpy()函数进行拷贝数据的区分 内存拷贝 ...

  4. 实现一个高效率的内存拷贝函数memcpy

    内存拷贝函数memcpy memcpy是memory copy的缩写,意为内存复制,在写C语言程序的时候,我们常常会用到它.它的函原型如下: void *memcpy(void *dest, cons ...

  5. 【C 语言】字符串拷贝 ( 函数形参使用推荐方法 | 凡是涉及 修改指针指向 的操作一律创建新的 指针变量 执行 | 引入 辅助 局部 指针变量 )

    文章目录 一.函数形参使用推荐方法 二.完整代码示例 一.函数形参使用推荐方法 在函数中 , 形参 中的 指针变量 , 不建议直接使用 ; 推荐 在 函数中 , 定义 局部 指针变量 , 接收 形参中 ...

  6. 字符串拷贝函数:strcpy的详解及模拟实现

    字符串拷贝函数:strcpy的详解及模拟实现!!! 对于字符串拷贝函数,之前在学习字符串时候,就已经学习过,但那只是片面的学习了一下,并没有经过系统的分析!只是大概的学习了一下!在关键的地方有时候还不 ...

  7. 字符串拷贝函数strdup()

    char *strdup(const char *s); 注: strdup()函数是c语言中常用的一种字符串拷贝库函数,一般和free()函数成对出现. 字符串拷贝函数strdup()内部实现如下: ...

  8. 字符串拷贝函数Strcpy的实现

    实现字符串拷贝函数时,一定要分清楚源头的字符串和目的字符串,两者的位置不同,首先是方法1: #include<stdio.h> #include<assert.h> void ...

  9. C语言学习笔记---数据拷贝函数memcpy()和memmove()函数

      在C语言中拷贝字符串的时候通常可以使用strcpy()函数和strncpy()函数,这两个函数是专门针对字符串拷贝的.如果想要拷贝其他类型数组的话,可以使用memcpy()和memmove()函数 ...

最新文章

  1. 在应用程序中替换Linux中Glibc的malloc的四种方法
  2. mysql blob key length_mysql – 没有密钥长度的密钥规范中使用的BLOB / TEXT列’bestilling’...
  3. wxWidgets:wxProcessEvent类用法
  4. mysql如何explan优化sql_《MySQL数据库》MySQL 优化SQL(explain)
  5. mysql中约束_【MySQL】:MySQL中四大约束
  6. 增强服务器安全性能,加强Linux服务器安全的20项建议
  7. Linux系统查看系统硬件,linux怎么查看系统硬件信息
  8. 黑马程序员--C语言基础之--sizeof()运算符的使用以及注意
  9. 图像处理:透镜畸变及校正模型
  10. 树莓派 zero cpu:elpida b4432bbpa-1d
  11. python小白逆袭大佬_Python小白逆袭大神心得
  12. 数据结构-01-链表数据结构之单链表
  13. webapi上传示例及调用方式(netframwork)
  14. mac修改eclipse的内存配置
  15. java制作进度条,Java制作进度条
  16. 基于CAD等高线的流域边界绘制
  17. 什么叫工业4.0,这篇接地气的文章终于讲懂了
  18. 智能电话机器人(AI语音机器人)是什么
  19. 实验7-4 身份证号码最后一位
  20. 如何搭建一套免费开源的微信群机器人问答系统?

热门文章

  1. python制作工资计算器-Python计算个人所得税
  2. python编程100例画图-Python练习实例56 | 画图,学用circle画圆形
  3. python中文编辑器推荐-python文本编辑器是什么
  4. pythonurllib模块-Python urllib模块 网络资源访问安装下载
  5. python画三维立体图-python之画三维图像
  6. python3.7.4-Python3.7.4入门-3函数
  7. python语言入门w-Python 基础教程
  8. python处理数据的优势-选择python进行数据分析的理由和优势
  9. 风云编程python-python网络编程(一)
  10. 合肥python培训-合肥Python测试开发全栈核心课程