目录

一、使用场景

二、算法

1. Java-数组遍历

2. c/c++ -索引遍历

3. c/c++ -指针遍历

三、数据说话

四、总结


一、使用场景

我们都知道不同的语言有不同的特性,所以在比较某一特性时,不同的语言会表现出差异。举个例子:我们都知道c/c++语言比Java的运行性能要高,但是具体高多少,其实我们心里是没有数的,那么本文章就是从一个简单的使用场景用数据来说话。

在开发的过程中,我需要将16bit的pcm数据从双声道转换到单声道,随着pcm文件的增大,处理的时间随之增加,而这个处理时间太长,直接影响的用户体验,所以我决定使用不同的语言做以下对比,选用运行性能的语言来处理,并且对算法进行优化。

(在分析后面的算法之前还需要了解以下16bit pcm数据格式)

二、算法

1. Java-数组遍历

    /*** pcm双声道转单声道** @param inPath* @param outPath*/public static boolean pcmStereo2Mono(String inPath, String outPath) {try {File file = new File(inPath);FileInputStream fis = new FileInputStream(file);int available = fis.available();byte[] data = new byte[available];byte[] data2 = new byte[available / 2];int read = fis.read(data, 0, available);for (int i = 0; i < available / 2; i++) {LogUtils.d(TAG, "");int t = i / 2 * 4 + i % 2;data2[i] = data[t];}File o = new File(outPath);o.createNewFile();FileOutputStream fos = new FileOutputStream(o);fos.write(data2);fos.close();return true;} catch (Exception e) {e.printStackTrace();}return false;}

2. c/c++ -索引遍历

    //文件长度,根据实际情况进行赋值int fileLength = -1;//文件数据,根据实际情况进行赋值unsigned char * pFileBuf = new unsigned char[fileLength];int nOneChannelLen = fileLength / 2;unsigned char * pOneChannelBuf = new unsigned char[nOneChannelLen];//遍历方式1:数组索引for(int i = 0;i<nOneChannelLen;i++){int t = i / 2 * 4 + i % 2;pOneChannelBuf[i] = pFileBuf[t];}

3. c/c++ -指针遍历

    //文件长度,根据实际情况进行赋值int fileLength = -1;//文件数据,根据实际情况进行赋值unsigned char * pFileBuf = new unsigned char[fileLength];int nOneChannelLen = fileLength / 2;unsigned char * pOneChannelBuf = new unsigned char[nOneChannelLen];//遍历方式2:指针for(int i = 0;i < nOneChannelLen/2;i++){(*pOneChannelBuf++) = (*pFileBuf++);(*pOneChannelBuf++) = (*pFileBuf++);pFileBuf = pFileBuf + 2;}//遍历之后一定要将指针复原,指回到缓冲区开始的位置,否则后面保存数据就会出错pFileBuf = pFileBuf - fileLength;pOneChannelBuf = pOneChannelBuf - nOneChannelLen;

三、数据说话

1.下面表格有三组数据,第一列是pcm语言文件的录制时长,第二列是对应pcm文件的文件大小,后面三列分别是用不同语言、不同算法,将16bit pcm文件从双声道转换到单声道所需要的时间,单位是ms。

语音时长(s) 文件大小(byte) java(ms) C++ -索引遍历 (ms) C++ -指针遍历 (ms)
10 287360 6057 2901 1129
24 668800 14548 6636 2648
31 859520 17592 8080 3388

2.如果以Java语言的时间为基准,那么c++语言的处理时间与java语言处理的时间比之如下:

java(ms)
------------java(ms)
C++ -索引遍历 (ms)
------------------java(ms)
C++ -指针遍历 (ms)
------------------
java(ms)
100.00% 47.89% 18.64%
100.00% 45.61% 18.20%
100.00% 45.93% 19.26%

四、总结

从以上数据可知,c/c++语言的处理效率要高于java语言,c/c++的指针访问的效率又高于索引访问的效率。

从双声道转单声道看语言/算法性能差异相关推荐

  1. 单声道数据转双声道_单声道转双声道方法

    单声道转双声道方法 前段时间有个朋友问我如何可以将一个音频文件的单声道转换为双声道 [音频文件右键查看 属性 → 摘要 → 音频 → 频道( 1. 单声道 2. 立体声) ] ,于是我推荐他用 Gol ...

  2. 记录一个音频PCM数据由双声道转单声道出错问题

    引言 工作需要将一份 双声道的PCM数据转换成单声道数据,我采用的是将左右声道样点值对应相加求平均样点值的办法. 计算式如下: typedef int s32; typedef unsigned in ...

  3. 基于C语言的 WAV 文件双声道转单声道的实现

    这里只处理PCM是16位,encode是PCM格式的波形进行解析: #include <stdio.h> #include <stdlib.h>#define u8 unsig ...

  4. 立体声、双声道、单声道的区别

    http://www.ccet.cn/newsdetail.aspx?newsid=193 假设双声道的左右两声道波形相位一样时,没有立体感 ,其效果和单声道一 样. (也就是说双声道不一定是立体声咯 ...

  5. WAV 文件双声道转单声道的实现

    一 代码 转载文章,修改了几处代码风格 #include <stdio.h> #include <stdlib.h>#define u8 unsigned char #defi ...

  6. 基于C语言实现把WAV双声道文件差分成两个单声道文件

    本deemo基于下面这篇文章的deemo实现 基于C语言的 WAV 文件双声道转单声道的实现_快乐的老鼠的博客-CSDN博客_wav 双声道转单声道 #include <stdio.h> ...

  7. C++音频单声道、双声道之间的转换

    本篇文件介绍 音频PCM数据的单声道.双声道之间的转换 下面介绍函数参数: 一.StereoToMono函数. 双声道转单声道 参数1:资源buffer(双声道数据) 参数2:资源buffer大小(双 ...

  8. android声音播放函数双声道合并,Android音视频系列(七):PCM音频单声道与双声道的相互转换...

    前言 上一篇我们已经学习了PCM音频的保存格式,这一篇我们通过掌握的知识,完成PCM音频的单声道和双声道的互相转换. 正文 首先我们把上一篇的最核心部分贴出来: PCM音频保存格式 我们首先完成单声道 ...

  9. 关于声音的前后左右上下的控制以及单声道立体声的区别

    一. 声像 在立体声重放技术中,用摆声像的方法把各个乐器的位置还原出来,这就是声像.一个乐器就是一个声像点. 我们知道声音是一种波,点击下面链接以flash形式演示波的振动. http://huang ...

最新文章

  1. python爬虫实例-python使用百度进行爬虫简单学习例子
  2. 一个在分割、检测与定位、高分辨率通用的网络
  3. tr的display属性出现td的colspan无效问题
  4. php中orm模型,模型model
  5. Ubuntu下如何正确安装FFmpeg
  6. XUtils之注解机制详解
  7. Ubuntu删除不干净导致的一系列后果
  8. vue-happy-scroll:vue中借助vue happy scroll实现局部文字滚动
  9. vue启动项目报错 `webpack-dev-server --inline --progress --config build/webpack.dev.conf
  10. 【Java 多线程 8】同步容器与并发容器
  11. ExtJs6 为Ext.Img对象添加单机事件
  12. IMDB 5000 Movie Dataset(来自IMDB的5000个电影的数据集)
  13. 桂林理工研究生院计算机软件工程,2019桂林理工大学硕士研究生复试细则之软件工程...
  14. 蓝队在攻防比赛中常用的防护手段汇总
  15. Arduino小白的学习历程
  16. javascript 正则里面 \s\S 和 . 的区别
  17. 【海量数据学院】DBA学习方法论系列之:明确的学习目标
  18. python 文字转语音 带情感_Python文字转换语音,让你的文字会「说话」抠脚大汉秒变撒娇萌妹...
  19. AI 机器学习实践总结
  20. Java中如何实现数组反转,将数组元素倒过来排列?【含详细解析】

热门文章

  1. Hydroxyl-PEG2000-NHS,HO-PEG2000-NHS,SHN-PEG2000-Hydroxyl
  2. 脑电分析系列[MNE-Python-11]| 信号空间投影SSP 应用
  3. 单变量与多变量线性回归(Linear Regression with One Variable)
  4. android开发-城市选择页面
  5. 量化交易(二)---------海龟交易法则
  6. 计算机丢失d3dx9_41.dll,d3dx9_41.dll(支持64位)
  7. 你所谓的鸡肋?Python中的多进程、多线程和协程
  8. c++代码 二元一次方程求解
  9. MacMagic for Mac(系统垃圾清理软件)
  10. invalid alteration of datatype(varchar2转化clob)