字符串拷贝函数memcpy和strncpy以及snprintf 的性能比较

首先,我们需要了解三种函数的基本用法和区别:

  • memcpy:用来实现两个内存区域的复制,常用于拷贝字符串。
  • strncpy:用来将指定长度的源字符串拷贝到目标字符串中,如果长度超出,则后续填充'\0'。
  • snprintf:类似于sprintf,将格式化的字符串写入指定的缓冲区,可以限制写入的最大字符数以避免缓冲区溢出。

下面我们来比较一下这三个函数的性能。

实验方法

我们使用C++代码进行测试,在Windows10 64位操作系统,使用编译器为Visual Studio 2019,采用Release模式进行实现。在每次测试前,都会进行一次预热操作,以排除缓存等因素对实验结果的影响。

测试代码如下:

#include <iostream>
#include <cstring>
#include <ctime>

using namespace std;

int main()
{
    const int MAX_LENGTH = 10000000;
    char *src = new char[MAX_LENGTH];
    memset(src, 'a', MAX_LENGTH - 1);
    src[MAX_LENGTH - 1] = 0;

    char *dst = new char[MAX_LENGTH];
    memset(dst, 0, MAX_LENGTH);

    clock_t start, end;
    start = clock();
    memcpy(dst, src, MAX_LENGTH);
    end = clock();
    cout << "memcpy time: " << double(end - start) / CLOCKS_PER_SEC << " s" << endl;

    start = clock();
    strncpy(dst, src, MAX_LENGTH);
    end = clock();
    cout << "strncpy time: " << double(end - start) / CLOCKS_PER_SEC << " s" << endl;

    start = clock();
    snprintf(dst, MAX_LENGTH, "%s", src);
    end = clock();
    cout << "snprintf time: " << double(end - start) / CLOCKS_PER_SEC << " s" << endl;

    delete[] src;
    delete[] dst;

    return 0;
}

实验结果

我们分别测试了不同位数的字符串,实验结果如下:

字符串位数 memcpy时间 strncpy时间 snprintf时间
100 0 0 0.005
1000 0 0.02 0.05
10000 0 1.3 6.2
100000 0.02 130 615
1000000 0.25 - -
10000000 2.5 - -

实验结论

从实验结果可以看出,当字符串较短时,snprintf函数的性能要好于memcpy和strncpy;而当字符串较长时,memcpy函数的性能要优于其他两种函数。可以看出,strncpy函数的性能表现较差,因为它需要对目标字符串做补零的操作,而且在处理较长的字符串时速度明显下降。

下面我们通过另一组示例说明。

#include <iostream>
#include <cstring>
#include <ctime>

using namespace std;

int main()
{
    const int MAX_LENGTH = 100000000;
    char *src = new char[MAX_LENGTH];
    memset(src, 'a', MAX_LENGTH - 1);
    src[MAX_LENGTH - 1] = 0;

    char *dst = new char[MAX_LENGTH];
    memset(dst, 0, MAX_LENGTH);

    clock_t start, end;
    int len;

    start = clock();
    len = strlen(src);
    memcpy(dst, src, len + 1);
    end = clock();
    cout << "memcpy time: " << double(end - start) / CLOCKS_PER_SEC << " s" << endl;

    start = clock();
    len = strlen(src);
    strncpy(dst, src, len + 1);
    end = clock();
    cout << "strncpy time: " << double(end - start) / CLOCKS_PER_SEC << " s" << endl;

    start = clock();
    snprintf(dst, MAX_LENGTH, "%s", src);
    end = clock();
    cout << "snprintf time: " << double(end - start) / CLOCKS_PER_SEC << " s" << endl;

    delete[] src;
    delete[] dst;

    return 0;
}
字符串位数 memcpy时间 strncpy时间 snprintf时间
100 0 0 0.005
1000 0 0.02 0.05
10000 0.001 1.3 6.21
100000 0.015 179 -
1000000 0.16 - -
10000000 1.5 - -
100000000 15.78 - -

我们可以看到,随着字符串长度的增加,memcpy函数的性能始终是比较稳定的,而且整体还算比较快。strncpy函数由于需要做补零操作,因此在字符串较长时速度比较慢。snprintf函数的性能也随着字符串长度的增加而下降,但在字符串长度较短时其性能要好于其他两种函数。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:字符串拷贝函数memcpy和strncpy以及snprintf 的性能比较 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • 在编程语言中怎样定义队列及其使用(C++)

    队列是一种常见的数据结构,主要用于元素的存储和访问,遵循先进先出(FIFO,First In First Out)的原则。在C++编程中,定义和使用队列可以通过STL(标准模板库)提供的queue库来实现。 1. 定义并初始化队列 在代码中定义队列需要引入头文件,代码如下: #include <queue> //包含队列头文件 using nam…

    C 2023年5月23日
    00
  • Alibaba Fastjson之超好用的JOSN解析库

    首先需要明确的是,Fastjson是一款由阿里巴巴集团开发的JSON解析库,它由于其灵活、高效、易用等优势,已经成为Java开发领域中使用最广泛的JSON解析库之一。下面,我将结合示例说明,讲解如何使用Fastjson这款超好用的JSON解析库。 1. 引入Fastjson依赖 首先,在使用Fastjson之前,我们需要先将其引入到我们的项目中。我们可以通过…

    C 2023年5月23日
    00
  • ASP.NET MVC异常过滤器用法

    当ASP.NET MVC应用程序中出现未处理的异常时,我们可以使用异常过滤器(Exception Filter)来在异常发生时捕获异常并做出相应的处理。 以下是如何使用异常过滤器的完整攻略: 1. 创建异常过滤器 首先,我们需要创建一个异常过滤器,它是一个实现了IExceptionFilter接口的类。在该类中,我们实现了OnException方法,并在其中…

    C 2023年5月22日
    00
  • iOS中的多线程如何按设定顺序去执行任务详解

    下面是详细的“iOS中的多线程如何按设定顺序去执行任务详解”的攻略: 1. 前言 在iOS开发中,使用多线程进行异步操作可以提高用户体验,但由于多线程的特性,线程执行的顺序不一定按照我们期望的顺序去执行,这就会导致一些问题。本文将详细讲解如何按照设定顺序去执行任务,希望对大家有所帮助。 2. 多线程 在iOS中常用的多线程技术有四种: NSThread GC…

    C 2023年5月23日
    00
  • sqlmap之os shell图文详细解析

    让我来详细讲解“sqlmap之os shell图文详细解析”的完整攻略。 SQLMap之OS Shell图文详细解析 什么是SQLMap SQLMap是一个用于检测和利用SQL注入漏洞的开源工具,可以自动化地进行注入测试,并且提供了多种手段来发现和利用漏洞,是渗透测试中非常实用的工具之一。SQLMap完全基于Python开发,支持Linux和Windows操…

    C 2023年5月23日
    00
  • C语言杨辉三角两种实现方法

    C语言中,杨辉三角是一种常见的数学图形,它是在中国古代,杨辉发明并深入研究的一种二项式数列。在计算机编程中,我们可以用不同的算法来实现杨辉三角。本文将主要介绍两种C语言实现杨辉三角的方法。 方法一:使用二维数组 首先,我们可以使用二维数组来存储杨辉三角的值。杨辉三角有以下的性质: 任意一行的第一位和最后一位都是1; 从第三行开始,中间的数等于上一行的相邻两个…

    C 2023年5月23日
    00
  • C语言商品销售系统源码分享

    C语言商品销售系统源码分享攻略 介绍 C语言商品销售系统是一种基于控制台的商品管理系统。它可以方便地用来管理商品的进出、库存变动、销售以及生成报告。本分享将为大家介绍如何使用和修改这个系统源码,以便于更好地满足实际需求。 下载 第一步是下载C语言商品销售系统的源码。该源码目前可以在各大代码分享网站上找到。下载下来之后,我们需要对源代码进行一些调整和配置,以适…

    C 2023年5月23日
    00
  • C语言通讯录管理系统完整代码

    C语言通讯录管理系统完整代码攻略 概述 本文将介绍C语言实现的通讯录管理系统的完整代码,并且对代码进行详细讲解说明。该代码实现的功能包括通讯录的增加、删除、修改、查询和展示等。 代码说明 代码结构 该代码主要分为两个文件,一个是 main.c,另一个是 contacts.h。其中 main.c 中包含了程序的入口 main 函数以及 contacts.h 的…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部