一个字符串拷贝的百万次测试

#include "stdafx.h"

#include <string.h>

#include <windows.h>

#include <time.h>

 

int _tmain(int argc, _TCHAR* argv[])

{

char sstr[256]="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";

SYSTEMTIME btime;

SYSTEMTIME endtime;

int i=0;

int j;

 

GetSystemTime(&btime);

printf("for     begintime  =  %02d:%02d:%02d.%04d/n",btime.wHour,btime.wMinute,btime.wSecond,btime.wMilliseconds);

i=0;

while ( i < 10000000 )

{

char tempstr1[256] = {0};

 

for (j=0;j<100;j++)

tempstr1[j]=sstr[j];

 

i++;

}

 

GetSystemTime(&endtime);

printf("for       endtime  =  %02d:%02d:%02d.%04d/n",endtime.wHour,endtime.wMinute,endtime.wSecond,endtime.wMilliseconds);

 

 

GetSystemTime(&btime);

printf("sprintf begintime  =  %02d:%02d:%02d.%04d/n",btime.wHour,btime.wMinute,btime.wSecond,btime.wMilliseconds);

 

i=0;

while ( i < 10000000 )

{

char tempstr[256] = {0};

sprintf(tempstr,"%s",sstr);

i++;

}

GetSystemTime(&endtime);

printf("sprintf endtime    =  %02d:%02d:%02d.%04d/n",endtime.wHour,endtime.wMinute,endtime.wSecond,endtime.wMilliseconds);

 

 

GetSystemTime(&btime);

printf("strcpy  begintime  =  %02d:%02d:%02d.%04d/n",btime.wHour,btime.wMinute,btime.wSecond,btime.wMilliseconds);

 

i=0;

while ( i < 10000000 )

{

char tempstr1[256] = {0};

strcpy(tempstr1,sstr);

i++;

}

 

 

GetSystemTime(&endtime);

printf("strcpy  endtime    =  %02d:%02d:%02d.%04d/n",endtime.wHour,endtime.wMinute,endtime.wSecond,endtime.wMilliseconds);

 

GetSystemTime(&btime);

printf("strncpy begintime  =  %02d:%02d:%02d.%04d/n",btime.wHour,btime.wMinute,btime.wSecond,btime.wMilliseconds);

 

i=0;

while ( i < 10000000 )

{

char tempstr1[256] = {0};

strncpy(tempstr1,sstr,100);

i++;

}

GetSystemTime(&endtime);

printf("strncpy endtime    =  %02d:%02d:%02d.%04d/n",endtime.wHour,endtime.wMinute,endtime.wSecond,endtime.wMilliseconds);

 

GetSystemTime(&btime);

printf("memcpy  begintime  =  %02d:%02d:%02d.%04d/n",btime.wHour,btime.wMinute,btime.wSecond,btime.wMilliseconds);

 

i=0;

while ( i < 10000000 )

{

char tempstr1[256] = {0};

memcpy(tempstr1,sstr,100);

i++;

}

 

GetSystemTime(&endtime);

printf("memcpy  endtime    =  %02d:%02d:%02d.%04d/n",endtime.wHour,endtime.wMinute,endtime.wSecond,endtime.wMilliseconds);

return 0;

}

 

 

 

 

测试结果i:

 

for     begintime     =  05:17:33.0201

for        endtime     =  05:17:36.0368

sprintf begintime   =  05:17:36.0368

sprintf  endtime     =  05:17:56.0571

strcpy  begintime   =  05:17:56.0571

strcpy   endtime     =  05:17:57.0198

strncpy begintime  =  05:17:57.0199

strncpy  endtime    =  05:17:57.0820

memcpy  begintime=  05:17:57.0820

memcpy  endtime  =  05:17:58.0236

 

无疑strcpy是最快的

 

 

 

 

说明:

1.char *strcpy(char *dest, const char *src)

       完成从源字符串到目的字符串的拷贝功能,必须确保目标字符串的空间足够容纳源字符串;strcpy是以'/0'为结束标志的;strcpy是字符串        拷贝,遇0则停;效率高且调用方便。

 

 

 

      const char *str1="abc/0def";

      char str2[7];

      strcpy(str2,str1)

      得到结果:str2="abc";也就是说,strcpy是以'/0'为结束标志的。

 

     strncpy 会复制一个以 '' 结束的字符串,但是如果字符串长度超过指定数量则被截断,但结果可能不包含 '' 表示结束

 

2.void *memcpy(void *dest, const void *src, size_t n);

 

 

memcpy 的操作对象不局限于某一类数据类型,或者说可 适用于任意数据类型,只要能给出对象的起始地址和内存长度信息、并且对象具有可操作性即可。鉴于 memcpy 函数等长拷贝的特点以及数据类型代表的物理意义,memcpy 函数通常限于同种类型数据或对象之间的拷贝,其中当然也包括字符串拷贝以及基本数据类型的拷贝。

 

 

 

memcpy 虽然高效,但是需要额外提供拷贝的内存长度这一参数,易错且使用不便;并且如果长度指定过大的话(最优长度是源字符串长度 + 1),还会带来性能的下降。对于基本数据类型来说,尽管可以用 memcpy 进行拷贝,由于有赋值运算符可以方便且高效地进行同种或兼容类型的数据之间的拷贝,所以这种情况下 memcpy 几乎不被使用。

 

     memset(str2,7);

 

     memcpy(str2,str1,7);

     得到结果:str2="abc/0def";

 

3.int   sprintf(char   *restrict,size_t   n,const   char   *restrict,...) 

 

 

    sprintf 的格式控制串中既然可以插入各种东西,并最终把它们“连成一串”,自然也就能够连接字符串,但不能直接连接没有以'  '结尾的字符数组,如果直接连接,肯定会导致非法内存操作,那该怎么办呢?我们自然会想起前面介绍打印整数和浮点数时可以指定宽度,字符串也一样的。

 

 

 

char ch[20];

 

 

sprintf(ch,"%s%10d","3sdfasdf",3);

 

sprintf(s, "%8d", 123); //产生:"   123" 

右对齐,不足的左边补0: 

sprintf(s, "%08X", 4567); //产生:"000011D7"

当然也可以左对齐:

sprintf(s, "%-8d", 123); //产生:"123    " 

 

 

snprintf 函数操作的对象 不限于字符串:虽然目的对象是字符串,但是源对象可以是字符串、也可以是任意基本类型的数据。这个函数主要用来实现 (字符串或基本数据类型)向 字符串 的转换 功能。如果源对象是字符串,并且指定 %s 格式符,也可实现字符串拷贝功能。

要额外指定格式符并且进行格式转化,麻烦且效率不高。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值