Lov*_*ity 45 c c++ performance matlab
我知道C/C++是一种低级语言,当我们与任何其他高级语言进行比较时,它会生成相对优化的机器代码.但我想这远不止于此,从实践中也可以看出这一点.
当我进行像高斯样本集合的montecarlo平均的简单计算时,我发现C++实现或MATLAB实现之间没有太大区别,有时实际上MATLAB在时间上表现得更好.
当我继续使用数千行代码进行更大规模的模拟时,慢慢地显示真实的图像.与同等的MATLAB实现相比,C++仿真显示出优越的性能,比时间复杂度高100倍.
大多数时候,C++中的代码几乎都是串行的,没有明确的高保真优化.然而,根据我的意识,MATLAB本身就做了很多优化.这显示了例如当我尝试生成大量随机样本时,其中使用像IT ++/GSL/Boost这样的库在C++中的等效执行相对较慢(使用的算法是相同的,即mt19937).
我的问题只是想知道MATLAB/C++在性能上是否有更简单的权衡.它就像人们所说的那样,"只要你能,C/C++就更好"(经验丰富的人)?从另一个角度来看,"除了舒适之外,什么是MATLAB的好处?"
顺便说一句,我没有看到编码效率参数在这里很重要,在这两种情况下都考虑了相同的程序员.而且,我认为像python,R这样的其他选择在这里并不重要.但依赖我们使用的特定库应该很有趣.
[我是通信系统中编码理论的博士生.我一直使用matlab/C++进行模拟,并且在两种情况下都有编码少量10K线的合理经验]
PhD*_*EcE 100
我已经使用Matlab和C++大约10年了.对于我的研究实现的每个数值算法,我总是从使用Matlab进行原型设计开始,然后将项目转换为C++,以获得10x到100x(我不是在开玩笑)的性能提升.当然,我将优化的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++中的算法测试需要不错的程序员以相同的方式编写或多或少优化的算法,并确保编译器不会以不同方式优化算法.
我最近的C++和Matlab经验:
在过去的一年里,我制作了几个大型的Matlab数据分析工具,并且遭受了Matlab的低速运行.但是通过以下技术,我能够将Matlab程序速度提高10倍:
运行/配置Matlab脚本,在C/C++中重新实现关键例程并使用MEX进行编译.关键程序很可能在逻辑上很简单,但数量很多.这将速度提高了5倍.
通过注释所有不必要的安全检查和输出参数计算,简化Matlab工具箱附带的".m"文件.请注意,修改后的代码不能与其余用户脚本一起分发.这将速度提高了2倍(在C/C++和MEX之后).
改进的代码在Matlab中约为98%,在C++中约为2%.
如果整个工具用C++编码,我相信可以将速度再提高2倍(总共20倍),这是计算程序的100倍速度提升.然后,硬盘I/O将占据程序运行时间.
DCS*_*DCS 10
根据我的经验(几年的计算机视觉和两种语言的图像处理),这个问题没有简单的答案,因为Matlab的性能在编码风格上强烈地依赖(并且远远超过C++性能).
通常,Matlab包含经典的基于C++/Fortran的线性代数库.所以任何事情x = A\b
都会非常快.此外,Matlab在为这些类型的问题选择最有效的求解器方面做得很好,因此x = A\b
Matlab将查看矩阵的大小并选择适当的低级例程.
如果你"代码化"你的代码,Matlab也会对大矩阵的数据操作有所了解,即如果你避免for
循环并使用索引数组或布尔数组来访问你的数据.这个东西是高度优化的.
对于其他例程,一些是用Matlab代码编写的,而另一些则用C/C++实现(例如Delaunay的东西).您可以通过键入来自行检查edit some_routine.m
.这将打开代码,您可以看到它是否全部是Matlab,或者只是编译器的包装器.
我认为,Matlab主要是为了舒适 - 但舒适性转化为编码时间和最终的金钱,这就是Matlab在行业中使用的原因.此外,对于来自计算机科学以外的其他领域的工程师来说,很容易学习,只需要很少的编程培训.
你的问题很难回答。一般来说,C++ 更快,但如果利用 Matlab 编写良好的算法,它可以超越 C++。在某些情况下,Matlab 可以并行化您的代码,而对于 C++,在许多情况下这必须手动完成。Mathlab 可以导出 C++ 代码。
所以我的结论是,你必须衡量这两个程序的性能才能得到答案。但是,然后您比较两个实现,而不是一般的 Matlab 和 C++。
作为一名博士生和10年的Matlab用户,我很高兴分享我的POV:
Matlab是开发和原型化算法的一个很好的工具,特别是在处理GUI,高级分析(频域,LS优化等)时:快速编码,强大的语法(想想[],{},等等).
一旦您的处理链更加稳定和定义,数据维度增长就会转向C/C++.
当考虑它的语言类似于脚本时,主要的Matlab限制会上升:只要你避免使用任何cicle(使用arrayfun,cellfun或其他矩阵程序),因为被调用的子程序再次在C/C++中,所以性能很高.
Matlab在线性代数和数组/矩阵运算方面做得很好,因为它们似乎一直在对基础运算进行一些额外的优化-如果您想在那里击败Matlab,则需要类似优化的BLAS / LAPACK库。
作为一种解释型语言,由于内部开销,每当调用Matlab函数时,Matlab都会浪费时间,这传统上意味着Matlab循环很慢。近年来,由于JIT编译器的重大改进(例如,在Matlab上的SO上搜索“性能”问题),这种情况有所缓解。由于函数调用的开销,所有尚未在后台用C / C ++实现的Matlab函数(调用edit functionName
以查看是否用Matlab编写)都可能比C / C ++同行慢。
最后,Matlab尝试变得用户友好,并且可能会进行“不必要的”输入检查,这可能会花费一些时间(由于函数调用开销)。例如,如果您知道可以ismember
得到排序的输入,则可以ismembc
直接调用(幕后编译函数),从而节省了大量时间。