热门标签 | 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


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







推荐阅读
  • Java 中 Writer flush()方法,示例 ... [详细]
  • 主要用了2个类来实现的,话不多说,直接看运行结果,然后在奉上源代码1.Index.javaimportjava.awt.Color;im ... [详细]
  • 本文详细探讨了KMP算法中next数组的构建及其应用,重点分析了未改良和改良后的next数组在字符串匹配中的作用。通过具体实例和代码实现,帮助读者更好地理解KMP算法的核心原理。 ... [详细]
  • 本文介绍如何使用Objective-C结合dispatch库进行并发编程,以提高素数计数任务的效率。通过对比纯C代码与引入并发机制后的代码,展示dispatch库的强大功能。 ... [详细]
  • 本文介绍了如何使用 Spring Boot DevTools 实现应用程序在开发过程中自动重启。这一特性显著提高了开发效率,特别是在集成开发环境(IDE)中工作时,能够提供快速的反馈循环。默认情况下,DevTools 会监控类路径上的文件变化,并根据需要触发应用重启。 ... [详细]
  • Java 中的 BigDecimal pow()方法,示例 ... [详细]
  • Java 类成员初始化顺序与数组创建
    本文探讨了Java中类成员的初始化顺序、静态引入、可变参数以及finalize方法的应用。通过具体的代码示例,详细解释了这些概念及其在实际编程中的使用。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 题目描述:给定n个半开区间[a, b),要求使用两个互不重叠的记录器,求最多可以记录多少个区间。解决方案采用贪心算法,通过排序和遍历实现最优解。 ... [详细]
  • CentOS7源码编译安装MySQL5.6
    2019独角兽企业重金招聘Python工程师标准一、先在cmake官网下个最新的cmake源码包cmake官网:https:www.cmake.org如此时最新 ... [详细]
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 本文探讨了 Objective-C 中的一些重要语法特性,包括 goto 语句、块(block)的使用、访问修饰符以及属性管理等。通过实例代码和详细解释,帮助开发者更好地理解和应用这些特性。 ... [详细]
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社区 版权所有