我一直在使用Matlab和C约10年。对于为我的研究实现的每个数值算法,我总是从使用Matlab的原型开始,然后将项目翻译成C,以获得10倍到100倍(我不是开玩笑)性能改进。当然,我比较优化的C代码和完全矢量化的Matlab代码。平均而言,改善约为50倍。

在这两种编程语言背后有很多细微差别,以下是一些误解:

> Matlab是一个脚本语言,但C是编译

Matlab使用JIT编译器将脚本翻译为机器码,通过使用Matlab提供的编译器,您可以将速度提高1.5倍至2倍。

> Matlab代码可能能够完全矢量化,但是你必须在C中手动优化你的代码

完全矢量化的Matlab代码可以调用用C/C++ / Assembly编写的库(例如Intel MKL)。但是简单的C代码可以由现代编译器合理地矢量化。

> Matlab提供的工具箱和例程应该进行很好的调整,并且应该具有合理的性能

除了线性代数例程之外,性能通常很差。

与矢量化Matlab代码相比,在C中可以获得10x〜100x性能的原因:

>在Matlab中调用外部库(MKL)会花费时间。

> Matlab中的内存是动态分配和释放的。例如,小矩阵乘法:

A = B * C D * E F * G

需要Matlab创建2个临时矩阵。在C中,如果你之前分配你的内存,你创建NONE。现在想象你循环这个语句1000次。 C中的另一个解决方案由C 11 Rvalue引用提供。这是C中最大的改进之一,现在C代码可以像纯C代码一样快。

>如果你想做并行处理,Matlab模型是多进程的,C方式是多线程的。如果你有许多小任务需要并行化,C提供线性增益高达许多线程,但你可能有负面的性能增益在Matlab。

>你通过引用在C中传递大对象,大块的内存,但在Matlab中相当棘手。

> C中的矢量化涉及使用内在/汇编,有时SIMD矢量化只能在C中。

>指针在C的奇迹。成像交换两个矩阵A和B:在Matlab中,它涉及第三个矩阵并且需要3 * N * N个基本复制操作。但在C中,这是通过接近零成本的指针完成的。

>在C中,有经验的编程人员可以完全避免L2高速缓存未命中甚至L1高速缓存未命中,从而将CPU推向其理论吞吐量限制。由于这个原因,Matlab的性能可以落后于C的10倍。

>在C中,计算强度指令有时可以根据它们的延迟(在汇编或内在函数中仔细地代码)和依赖性(大多数时间由编译器或CPU硬件自动完成)来分组,使得理论IPC(每个时钟周期的指令)并达到CPU管线。

然而,与Matlab相比,C中的开发时间也是10倍的因素!

为什么你应该使用Matlab而不是C:

>数据可视化。我认为我的职业生涯可以继续没有C,但我将无法生存没有Matlab只是因为它可以产生美丽的情节!

>低效率,但数学稳健的内置例程和工具箱。首先得到正确的答案,然后谈论效率。人们可以在C中产生微妙的错误(例如隐式地将double转换为int)并获得正确的结果。

>表达你的想法,并向你的同事展示你的代码。 Matlab代码比C更容易阅读和更短,并且Matlab代码可以无需编译器正确执行。我只是拒绝阅读其他人的C代码。我甚至不使用C GNU科学图书馆,因为代码质量不能保证。研究人员/工程师使用C库作为一个黑盒是危险的,并采取准许的准许。即使对于商业C/C++库,我记得英特尔编译器在其sin()函数中有一个符号错误,并且MKL中也出现了数值精度问题。

最后但是同样重要的:

因为一旦Matlab代码被矢量化,对于程序员来说没有多少优化,与C代码相比,Matlab代码性能对代码质量的敏感性要低得多。因此,最好在Matlab中优化计算算法,稍微更好的算法通常在Matlab中具有稍微更好的性能。另一方面,C中的算法测试需要可靠的程序员以相同的方式编写以或多或少优化的算法,并且确保编译器不会以不同的方式优化算法。

matlab和c 性能,性能权衡 – 什么时候是MATLAB更好/慢于C/C++相关推荐

  1. 基于Matlab的LDPC码性能研究毕业设计(含源文件)

    欢迎添加微信互相交流学习哦! 项目源码:https://gitee.com/oklongmm/biye 本科毕业设计(论文) 题 目    LDPC码性能研究 摘 要     信道编码是数字通信系统的 ...

  2. inl和dnl matlab_请问如何用matlab仿真它的性能, 比如 INL, DNL, SFDR,EOB等等。

    如果用Hspice仿真一个Pipelined ADC, 之后如何用matlab仿真它的性能, 比如 INL, DNL, SFDR,EOB等等. 这个你可能要自己编程. 小编能给个联系方式吗?我做的也是 ...

  3. PID控制器——MATLAB/Simulink仿真以及性能比较与分析

       本文主要内容:PID控制器,MATLAB/Simu link仿真模型的搭建.介绍以及各控制器性能的比较与分析.  一.本文中用到的Simulink模块    1. 传递环数模块 (Transfe ...

  4. matlab gui电机,基于MATLAB GUI的感应电机性能分析界面设计.docx

    摘要:本设计通过键入GUIDE命令打开GUI编辑界面,GUI(Graphical User Interfaces)意指图形用户界面,相较于命令行界面更容易在视觉上被接受. 用户可通过一定方法,如键盘鼠 ...

  5. matlab在风能领域,基于Matlab/Simulink的风力机性能仿真研究

    能源研究与信息 第 22 卷 第 2 期 Energy Research and Information Vol. 22 No. 2 2006 收稿日期:2005-10-14 作者简介:高 平(198 ...

  6. 锐龙4000系列运行matlab,修复了!AMD锐龙运行Matlab恢复正常,性能提升60%

    原标题:修复了!AMD锐龙运行Matlab恢复正常,性能提升60% Matlab是美国MathWorks出品的商业数学软件,用于算法开发.数据可视化.数据分析以及数值计算等用途.在2020a版本中,M ...

  7. matlab i5 i7,i5性能等于i7?全负荷压力详细测试告诉你

    [PConline%20评测]2012年是intel的"制程年",所谓制程年是说intel的产品路线是按照Tick-Tock的方式,让处理器的纳米制程和核心构架每隔一年轮番进步.我 ...

  8. 最大化 AIX 上的 Java 性能,第 3 部分: 更多就是更好

    http://www.ibm.com/developerworks/cn/aix/library/es-Javaperf/es-Javaperf3.html 最大化 AIX 上的 Java 性能,第 ...

  9. 华为荣耀是待机之王、性能之王、分享之王,我们更希望他是平民之王

    华为荣耀是待机之王.性能之王.分享之王,我们更希望他是平民之王 据说,华为荣耀四核是个待机王.四核手机中的持久型选手.快速充电4小时可以超长待机15天.这样的持久功夫不仅源于1930的大容量电池.还源 ...

  10. matlab错误使用assert,关于异常处理:何时在Matlab中使用assert()?

    由于Matlab被解释,通常会在执行函数签名的函数开头花费大量时间. 例如 if nargin ~= 2; error('must provide two input args a and b'); ...

最新文章

  1. 【怎样写代码】对象克隆 -- 原型模式(二):解决方案
  2. velocity.js 动画插件
  3. XMLHttpRepuest2
  4. Kylin、Druid、ClickHouse核心技术对比
  5. Angular Component TypeScript代码和最后转换生成的JavaScript代码比较
  6. TCP、UDP、HTTP、SOCKET之间的区别
  7. MATLAB中的微积分运算(数值符号)
  8. java+包装类,装箱和拆箱_Java包装类,装箱和拆箱详解
  9. SQL Server2008数据库的维护 (第四部分)
  10. 【Basking Rootwalla】真正理解setup time/hold time(二)
  11. 通过配置文件添加MIME类型
  12. 构建 QC + QTP 自动化测试框架 2:QC 与 QTP 安装
  13. Android OTA相关博文
  14. iOS “[App] if we're in the real pre-commit handler we can't actually add any new fences due
  15. php中explode与split的区别
  16. 如何区别文本是BIG5还是GB?
  17. ios13.5.1降级_升级iOS 14尝鲜后 无法降级iOS13.5.1?
  18. c++模板函数的声明和定义该在什么文件里?
  19. 陶陶摘苹果(python)
  20. vscode中setting.json配置详解

热门文章

  1. 废品机械师双脚机器人教程_废品机械师自动寻物机器人图文教程_快吧单机游戏...
  2. li标签横向排列_lt;bdigt; | HTML5 双向隔离标签
  3. html 评分五角星的插件,jquery五角星评分插件示例分享
  4. mysql 存储引擎作用_MySQL常用存储引擎功能与用法详解
  5. php mysql网页评论,PHP / MySQL:如何在您的网站中创建评论部分
  6. 账号类型_2019年头条、百家、大鱼、企鹅四平台哪种类型的账号最受欢迎?
  7. 基于JAVA+SpringBoot+Mybatis+MYSQL的进销存管理系统
  8. 数据库(表结构和数据) 保存为 *.sql文件
  9. vue 自定义组件 v-model
  10. Python中单引号,双引号,三个单引号,外双单引号内双引号,外双引号内单引号的区别...