热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

memcpy的速度测试

想把一组chara[4096]的数组拷贝到shortb[6][256]中,尝试过用循环移位的方式,还用中间变量shortc[2048]的方式。得出的结论:1.移位方式效率最低2.




想把一组char a[4096]的数组拷贝到short b[6][256]中,尝试过用循环移位的方式,还用中间变量short c[2048]的方式。得出的结论:
1. 移位方式效率最低
2. 借用中间变量,变量如果是局部栈中,那么速度比全局的中间变量速度快,缺点是怕栈溢出。
验证代码如下:


//file name testcpyspeed.c
#include
#include
#include
#include
#define MTW_VIRTUTALCHNUMS (2)
#define MTW_PHYCHNUMS (6)
#define MTW_MAXCHNUMS (MTW_VIRTUTALCHNUMS+MTW_PHYCHNUMS)
#define MTW_SAMPLESSZIE (256)
typedef short int16_t;
int16_t mic_data[MTW_PHYCHNUMS][MTW_SAMPLESSZIE] = {0,};
int16_t *mic[MTW_PHYCHNUMS] = {0,};
//int16_t ref_fft[MTW_SAMPLESSZIE] = {0,};
int16_t ref_fft[MTW_SAMPLESSZIE] = {0,};
int16_t output[MTW_SAMPLESSZIE] = {0,};

static int mmap_mwsrchannel(char *databuff,int len)
{
int i=0;
if(len<4096){
printf("ERROR: %s %d error: length:%d\n",__func__,__LINE__,len);\
return -1;
}
for( i = 0; i <256; i++){
mic_data[0][i] = ((databuff[i * 16])|(databuff[i * 16 +1 ]<<8));
mic_data[1][i] = ((databuff[i * 16+1*2])|(databuff[i * 16 +1*2 +1 ]<<8));
mic_data[2][i] = ((databuff[i * 16 +2*2])|(databuff[i * 16 +2*2 +1]<<8));
mic_data[3][i] = ((databuff[i * 16+3*2])|(databuff[i * 16 +3*2 +1 ]<<8));
ref_fft[i]=((databuff[i * 16 + 4*2])|(databuff[i * 16 + 4*2 +1]<<8));
mic_data[4][i] = ((databuff[i * 16 + 6 * 2 ])|(databuff[i * 16 + + 6 *2 +1 ]<<8));
mic_data[5][i] = ((databuff[i * 16 + 7 * 2 ])|(databuff[i * 16 + 7 * 2 +1 ]<<8));
}
return 0;
}
void record_to_buff(char *buff,int len)
{
int i=0;
for(i=0;i buff[i]=i%256;
}
}
int main(int argc,char *argv[])
{
int i=0;
int len=atoi(argv[1]);
char *buff=malloc(4096);
for(i=0;i record_to_buff(buff,4096);
mmap_mwsrchannel(buff,4096);
}
return 0;
}

linjuntao@linjuntao:~/Desktop/proctice/chartoshort$ cat teststos.c 
#include
#include
#include
#include
#define MTW_VIRTUTALCHNUMS (2)
#define MTW_PHYCHNUMS (6)
#define MTW_MAXCHNUMS (MTW_VIRTUTALCHNUMS+MTW_PHYCHNUMS)
#define MTW_SAMPLESSZIE (256)
typedef short int16_t;
int16_t mic_data[MTW_PHYCHNUMS][MTW_SAMPLESSZIE] = {0,};
int16_t *mic[MTW_PHYCHNUMS] = {0,};
//int16_t ref_fft[MTW_SAMPLESSZIE] = {0,};
int16_t ref_fft[MTW_SAMPLESSZIE] = {0,};
int16_t output[MTW_SAMPLESSZIE] = {0,};

static int mmap_mwsrchannel(char *databuff,int len)
{
int i=0;
if(len<4096){
printf("ERROR: %s %d error: length:%d\n",__func__,__LINE__,len);\
return -1;
}
int16_t data[2048];
memcpy(data,databuff,4096);
for( i = 0; i <256; i++){
mic_data[0][i] = data[i * 8 ];
mic_data[1][i] = data[i * 8 + 1 ];
mic_data[2][i] = data[i * 8 + 2];
mic_data[3][i] = data[i * 8 +3];
ref_fft[i]=data[i * 8 + 4];
mic_data[4][i] = data[i * 8 + 6];
mic_data[5][i] = data[i * 8 + 7];
}
return 0;
}
void record_to_buff(char *buff,int len)
{
int i=0;
for(i=0;i buff[i]=i%256;
}
}
int main(int argc,char *argv[])
{
int i=0;
int len=atoi(argv[1]);
char *buff=malloc(4096);
for(i=0;i record_to_buff(buff,4096);
mmap_mwsrchannel(buff,4096);
}
return 0;
}


linjuntao@linjuntao:~/Desktop/proctice/chartoshort$ cat teststoglobals.c 
#include
#include
#include
#include
#define MTW_VIRTUTALCHNUMS (2)
#define MTW_PHYCHNUMS (6)
#define MTW_MAXCHNUMS (MTW_VIRTUTALCHNUMS+MTW_PHYCHNUMS)
#define MTW_SAMPLESSZIE (256)
typedef short int16_t;
int16_t mic_data[MTW_PHYCHNUMS][MTW_SAMPLESSZIE] = {0,};
int16_t *mic[MTW_PHYCHNUMS] = {0,};
//int16_t ref_fft[MTW_SAMPLESSZIE] = {0,};
int16_t ref_fft[MTW_SAMPLESSZIE] = {0,};
int16_t output[MTW_SAMPLESSZIE] = {0,};

int16_t data[2048];
static int mmap_mwsrchannel(char *databuff,int len)
{
int i=0;
if(len<4096){
printf("ERROR: %s %d error: length:%d\n",__func__,__LINE__,len);\
return -1;
}
memcpy(data,databuff,4096);
for( i = 0; i <256; i++){
mic_data[0][i] = data[i * 8 ];
mic_data[1][i] = data[i * 8 + 1 ];
mic_data[2][i] = data[i * 8 + 2];
mic_data[3][i] = data[i * 8 +3];
ref_fft[i]=data[i * 8 + 4];
mic_data[4][i] = data[i * 8 + 6];
mic_data[5][i] = data[i * 8 + 7];
}
return 0;
}
void record_to_buff(char *buff,int len)
{
int i=0;
for(i=0;i buff[i]=i%256;
}
}
int main(int argc,char *argv[])
{
int i=0;
int len=atoi(argv[1]);
char *buff=malloc(4096);
for(i=0;i record_to_buff(buff,4096);
mmap_mwsrchannel(buff,4096);
}
return 0;
}

//编译:
cc testcpyspeed.c -o testor ;gcc teststos.c -o test16_16 ; gcc teststoglobals.c -o teststoglobals
//验证:
linjuntao@linjuntao:~/Desktop/proctice/chartoshort$ time ./testor 200000

real 0m1.999s
user 0m1.996s
sys 0m0.000s
linjuntao@linjuntao:~/Desktop/proctice/chartoshort$ time ./test16_16 200000

real 0m1.661s
user 0m1.660s
sys 0m0.000s
linjuntao@linjuntao:~/Desktop/proctice/chartoshort$ time ./teststoglobals 200000

real 0m1.658s
user 0m1.656s
sys 0m0.000s

linjuntao@linjuntao:~/Desktop/proctice/chartoshort$ time ./test16_16 4000000

real 0m33.031s
user 0m33.028s
sys 0m0.000s
linjuntao@linjuntao:~/Desktop/proctice/chartoshort$ time ./teststoglobals 4000000

real 0m33.157s
user 0m33.156s
sys 0m0.000s
linjuntao@linjuntao:~/Desktop/proctice/chartoshort$ time ./testor 4000000

real 0m40.298s
user 0m40.292s
sys 0m0.004s


如果执行频率比较高,还是使用局部临时变量拷贝比较快。







推荐阅读
  • 本文通过分析一个具体的案例,探讨了64位Linux系统对32位应用程序的兼容性问题。案例涉及OpenVPN客户端在64位系统上的异常行为,通过逐步排查和代码测试,最终定位到了与TUN/TAP设备相关的系统调用兼容性问题。 ... [详细]
  • 本文介绍如何手动实现一个字符串连接函数,该函数不依赖于C语言的标准字符串处理函数,如strcpy或strcat。函数原型为void concatenate(char *dest, char *src),其主要作用是将源字符串src追加到目标字符串dest的末尾。 ... [详细]
  • 本文介绍了一种方法,通过使用Python的ctypes库来调用C++代码。具体实例为实现一个简单的加法器,并详细说明了从编写C++代码到编译及最终在Python中调用的全过程。 ... [详细]
  • 深入解析 C++ 中的 String 和 Vector
    本文详细介绍了 C++ 编程语言中 String 和 Vector 的使用方法及特性,旨在帮助开发者更好地理解和应用这两个重要的容器。 ... [详细]
  • 使用Matlab创建动态GIF动画
    动态GIF图可以有效增强数据表达的直观性和吸引力。本文将详细介绍如何利用Matlab软件生成动态GIF图,涵盖基本代码实现与高级应用技巧。 ... [详细]
  • 本文详细介绍了在Luat OS中如何实现C与Lua的混合编程,包括在C环境中运行Lua脚本、封装可被Lua调用的C语言库,以及C与Lua之间的数据交互方法。 ... [详细]
  • Hanks博士是一位著名的生物技术专家,他的儿子Hankson对数学有着浓厚的兴趣。最近,Hankson遇到了一个有趣的数学问题,涉及求解特定条件下的正整数x,而不使用传统的辗转相除法。 ... [详细]
  • 本文详细探讨了在Java中如何将图像对象转换为文件和字节数组(Byte[])的技术。虽然网络上存在大量相关资料,但实际操作时仍需注意细节。本文通过使用JMSL 4.0库中的图表对象作为示例,提供了一种实用的方法。 ... [详细]
  • 函子(Functor)是函数式编程中的一个重要概念,它不仅是一个特殊的容器,还提供了一种优雅的方式来处理值和函数。本文将详细介绍函子的基本概念及其在函数式编程中的应用,包括如何通过函子控制副作用、处理异常以及进行异步操作。 ... [详细]
  • 在1995年,Simon Plouffe 发现了一种特殊的求和方法来表示某些常数。两年后,Bailey 和 Borwein 在他们的论文中发表了这一发现,这种方法被命名为 Bailey-Borwein-Plouffe (BBP) 公式。该问题要求计算圆周率 π 的第 n 个十六进制数字。 ... [详细]
  • 利用 Calcurse 在 Linux 终端高效管理日程与任务
    对于喜爱使用 Linux 终端进行日常操作的系统管理员来说,Calcurse 提供了一种强大的方式来管理日程安排、待办事项及会议。本文将详细介绍如何在 Linux 上安装和使用 Calcurse,帮助用户更有效地组织工作。 ... [详细]
  • 本文通过C++语言实现了一个递归算法,用于解析并计算数学表达式的值。该算法能够处理加法、减法、乘法和除法操作。 ... [详细]
  • 问题描述现在,不管开发一个多大的系统(至少我现在的部门是这样的),都会带一个日志功能;在实际开发过程中 ... [详细]
  • 字符串中特定模式出现次数的计算方法
    本文详细探讨了如何高效地计算字符串中特定模式(如'pat')的出现次数,通过实例分析与算法解析,帮助读者掌握解决此类问题的方法。 ... [详细]
  • 本文探讨了在SQL Server中处理几何类型列时遇到的INTERSECT操作限制,并提供了解决方案,包括通过转换数据类型和使用额外表结构的方法。 ... [详细]
author-avatar
十月
我的征途是星辰大海!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有