在C++中,同一功能的函数用不同方法实现,所需要的时间开销可能会有差异。比较不同实现方式的时间开销,有利于更好地达到目的。

strcpy中不同字符操作方式

现以实现C语言中的strcpy函数为例,比较字符行数据的单个移动和整块移动、用指针方式操纵字符和用数组方式操纵字符之间的时间差异。本实验环境为win10的VS2022平台,程序运行选择的解决方案平台为x64,具体程序如下:

C++统计时间开销的方法

chrono是C++时间操作库的头文件。在C++中统计时间开销可使用如下方式:

不同字符操纵方式的时间差异

经过测试,在C++中使用memcpy函数进行整块字符操纵,其效率远高于对单个字符依次移动。
在对字符依次单个操纵的方式中,根据条件的不同,时间开销也略有不同。

下面为使用分文件编程的测试程序,分别对三个函数进行一亿次调用,统计其时间开销:

经过多次测试,时间开销均为使用memcpy方式时间最少,使用数组方式其次,使用指针方式时间最大。

分文件方式测试结果

当不使用分文件方式时,使用memcpy方式时间依旧最少。而数组和指针方式,由于数组下标的差异,有所差别。

在64位平台下,C++指针变量占用的内存空间为8字节,int类型的变量占用4字节,long long类型的变量占用8字节。

当数组使用int类型的下标时,数组方式所占用的时间均少于指针方式,其中一次测试结果如下图所示。

使用非分文件方式1

当数组使用long long类型的下标时,数组方式所占用的时间略多于指针方式,其中一次测试结果如下图所示。

使用非文件方式2

结论

在C++中操纵字符时,为提高效率,应尽量使用memcpymemmove等内置函数操纵整块字符串。
对单个字符依次操纵时,指针和数组方式各有优势,使用数组更简单。

最后修改日期: 2023年7月27日

留言

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。

11 − 1 =