使用新的MATLAB执行引擎更快地运行代码
今天我想向你们介绍一位客座博主Dave Bergstein,他是MathWorks的MATLAB产品经理。今天Dave将讨论新的MATLAB执行引擎。
内容
重新设计的执行
在R2015b中,我们通过引入新的MATLAB执行引擎改变了所有MATLAB代码的执行方式。改进的体系结构运行MATLAB程序更快,并为未来的增强提供了平台。而且这些好处不需要修改代码。
看看一些客户是如何评价新的执行引擎的:
“我与各种各样的客户一起工作,花时间帮助他们中的许多人加快他们现有的MATLAB代码。看到新的执行引擎对性能的帮助,我非常兴奋。一个客户报告说,一个关键的性能关键流程现在在R2015b中运行的速度是原来的两倍,这对他们的日常操作产生了显著的积极影响。”实验后奥特曼
MATLAB专家,《加速MATLAB性能》一书的作者(CRC出版社)
“R2015中新的MATLAB执行引擎将我们的MATLAB代码的执行时间减半。”罗伯特·丹弗斯
科勒公司工程、分析建模和测试实验室主任
我的应用程序——“一维和二维有限体积的热传导和流体流动”——表现明显更好——大约好35%。好工作!”恩里科高贵的
意大利里雅斯特大学工程与建筑系热力学与传热教授
它对您的意义:更好的性能、质量和可扩展性
在设计新的执行引擎时,从一开始就考虑到了性能。以下是一些具体的语言领域得到了最显著的改进:
- 函数调用:函数调用开销大大减少;将代码组织成许多小函数不再有明显的性能损失。
- 面向对象的特点:许多面向对象操作执行得更快。
- 元素智慧数学运算:许多基于元素的数学操作执行得更快。
在这些方面和其他方面的加速有很多因素,包括改进的MATLAB代码的即时(JIT)编译。重新设计执行引擎也是重新访问和解决旧语言的缺陷和bug,提高质量的时候。这是一个机会来设计引擎的可扩展性,促进未来的增强和新功能的出现。
什么是JIT编译?
新的MATLAB执行引擎可以JIT编译所有的MATLAB代码,这是它如何更快地执行代码的一个重要因素。像c++这样的编程语言被称为编译语言。c++代码要经过一个由作者发起的编译步骤。这个编译步骤生成直接在目标硬件上执行的机器代码。编译器通常可以优化生成的代码,以帮助应用程序更快地执行。
解释语言由解释器程序逐个命令地执行,不需要显式的编译步骤。对于与数据交互工作的工程师和科学家来说,以这种方式执行命令非常有帮助,在他们工作时改变命令的顺序。尽管这种执行风格对于探索想法非常有效,但在执行代码块时可能会很慢。
通过实时编译MATLAB代码,MATLAB提供了两方面的优点。无论是在类、函数、脚本中,还是在命令行中,都可以编译MATLAB代码。没有显式的编译步骤供用户初始化,MATLAB代码可以在小到每次一行的块中执行。MATLAB JIT编译器生成针对正在执行的MATLAB代码和特定硬件平台进行优化的本机级代码。
MATLAB从2002年R13版本开始使用JIT编译。最初的JIT编译器被设计为MATLAB解释器的补充,并且支持该语言的有限子集。万博1manbetx新的执行引擎的设计重点是JIT编译,其中JIT编译是引擎的一个组成部分,能够编译整个MATLAB语言。
例如改善
这个例子说明了新的JIT编译器的好处。它演示了以前的JIT编译器和可以编译所有MATLAB代码的新JIT编译器之间的区别。
这个函数test1调用函数foo1在for循环中,它使用循环变量执行简单的计算2.这个函数foo1方法首先检查其输入值并可能发出错误错误如果输入超出范围,则执行命令。在本例中不会出现错误确认,但是这种输入检查是一种常见的实践,在函数被重用时很有帮助。
函数Test1 x = 0 (1,1e6);为Ii = 1:1e6 x(Ii) = foo1(Ii);结束结束函数Y = foo1(x)如果(x < 0)错误(“x一定是正的”);结束Y = 2*x.^2+3*x+4;结束
我记录了以下时间Test1使用时间命令在我的笔记本电脑[1]:
- Test1R2015a: 1.7887秒
- Test1R2015b: 0.0435秒
新的执行引擎执行这个示例的速度快了40多倍!
接下来,考虑一下当我们对测试进行轻微更改时会发生什么。Test2和Test1除了它调用foo2它通过另一个函数发出可能的错误。
函数Test2 x = 0 (1,1e6);为Ii = 1:1e6 x(Ii) = foo2(Ii);结束结束函数Y = foo2(x)如果(x < 0) displayError;结束Y = 2*x.^2+3*x+4;结束函数displayError错误(“x一定是正的”);结束
我记录了以下时间Test2使用时间命令:
- Test2R2015a: 3.8667秒
- Test2R2015b: 0.0430秒
与R2015aTest2要花两倍的时间Test1(3.8667秒vs 1.7887秒)。减速的原因是增加的代码复杂性限制了以前的JIT编译器编译代码的能力。R2015b的执行时间Test1而且Test2几乎是一样的,展示了新的执行引擎JIT编译所有MATLAB代码的能力。结果是Test2使用R2015b中的新执行引擎,执行速度快了近90倍。
提高性能
MATLAB花了一些时间编译代码。编译的时间通常比执行代码的时间要短。当代码在MATLAB会话中重复运行而不被清除时,您将获得最大的好处,因为代码只需要编译一次。重复运行代码的例子是for循环或重新运行未修改的MATLAB文件。了解了这一点,考虑以下方法来提高代码的性能:
- 避免使用清除所有因为它会清除编译后的代码。使用清晰的相反,当你只是想清除数据,避免重新招致MATLAB编译的时间。
- 将代码模块化到多个文件中,这样在进行编辑时,就可以减少下次运行时重新编译的代码量。将代码模块化为独立的函数和类也有助于提高代码的可读性、可重用性和可维护性。
结果
我们收集并测试了76个性能敏感的用户应用程序,以评估新引擎的性能。测试程序的大小从几十行代码到数百行代码不等,涵盖了从设备模拟到金融的各种应用程序。下面的直方图显示了在MATLAB 15b中运行速度比15a快或慢的应用程序(或测试)的数量。从直方图中,您可以看到有强烈的右移,这表示更快的性能。使用新的执行引擎,这些应用程序的运行速度平均提高了40%。超过12个应用程序的运行速度至少是原来的两倍。
你的代码有多快?
通过下载和安装R2015b,用重新设计的MATLAB执行引擎测试代码。一旦开始运行代码,您就可以利用MATLAB执行引擎了。有关改进代码性能的提示,请参见提高性能的技术.要了解有关评估代码性能的更多信息,请参见测量程序的性能.并通过留言与我们分享您的代码如何使用新的执行引擎执行在这里!
有关计时代码的详细讨论,请参见Loren十二月的博客帖子.
评论
如欲留言,请点击在这里登录到您的MathWorks帐户或创建一个新帐户。