制作MATLAB代码的主要案例研究更快
介绍
在其核心,使程序更快地探讨了两个简单的步骤。
- 找出究竟是什么慢。
- 尝试不同的东西,看看它是否在仍然提供正确的答案
正如你想象的那样,上面隐藏了一个复杂的世界。“尝试不同的东西”可能意味着使用语言特征来优化我写入的算法,尝试并行甚至切换到完全不同的算法的Althogether。我通常向第2点添加一个额外的约束,这是“尽可能少的努力”,因为我从根本上懒惰。
当然,当我们需要优化我们的速度时,我希望能够分享最近在内部讨论的示例。
不要害怕弯帽
灵感来自这篇文章
,同事在Matlab中写下以下内容来计算素数。
类型mycountprimes.m.
numprimes = mycountprimes(1000000)
numprimes = 78498.
f = @()mycountprimes(1000000);
OriginalSpeed = Timeit(F)
OriginalSpeed = 3.7878.
即便如此,我们也有很多事情可以努力加快这段特定的代码。我们可以利用循环的每一次迭代的事实
mycountpimes.
是独立的,并使用并行
议案环形
。这很容易做,但在计算资源方面可能很重。一旦你意识到你可以利用
议案
,尝试使您的问题抛出尽可能多的CPU核心,这变得很诱人。这几天我最喜欢做这一点的方法就是开枪
云中心集群
并加速核心计数,如此有意义。
改变摩擦至地面
探查器表明我在线中花了很多时间
如果mod(n,i)== 0
所以一个方法是问
“我们可以重写那条线吗?
。这并不总是很明显哪种替代方案可能工作,所以我经常弄清楚不同的方式来做一些事情并试一试。写表达的另一种方法
mod(n,i)== 0
是
地板(n / i)== n / i
事实证明要快得多!我这样做了
Floormycountprimes.
函数,检查它给出了正确的结果,并表明它确实更快。
numprimes = floormycountprimes(1000000)
numprimes = 78498.
f = @()floormycountprimes(1000000);
地板= Timeit(F)
楼层距= 0.5296
尝试整数算法的整数类型
默认情况下,MATLAB中的所有数字都是浮点类型
双倍的
这对于许多数值计算非常重要,但在这里我们正在处理纯粹的整数算法。它有时可以支付股息,以使这是在代码中的明确,这是其中一个时代!事实证明
摩擦
在处理浮点数时,功能必须做更多的工作,而是对于该特定示例的严格必需。作为程序员,我知道我的算法基于完全整数,所以我可以切换到使用
UINT32.
对于一些变量。也就是说,我改变了主循环
myisprime.
至
Q =楼层(SQRT(N));
n = uint32(n);
为了i = uint32(2):q
如果mod(n,i)== 0
结果= false;
返回
结尾
结尾
这允许MATLAB使用专业和更快的版本
摩擦
功能自现在知道我们正在处理整数而不是双打。
我这样做了
uint32myisprime.
在此帖子末尾定义的功能,并通过uint32调用它
mycountpimes。
首先让我们检查结果与原始功能一致,然后时间
numprimes = uint32mycountprimes(1000000)
numprimes = 78498.
f = @()uint32mycountprimes(1000000);
uint32speed = timeit(f)
UINT32SPEED = 0.5660.
使用这种方法或基于楼层的方法,我们实现了相对较少的工作和技术的显着性能提升
议案
如果我们需要更多的速度,并行仍在桌面上。
matlab作为算法的存储库
最后,我们可以认识到,我们使用的基本算法来计算inches的不是最佳的,而不是使用不同的。将此置于极端,我们可以记住MATLAB是数字算法的存储库以及编程语言,因此找到直接解决我们想要解决的问题而不是滚动自己的语言的存储库。快速搜索文档揭示了
素瓜
返回次要次数的函数。我们生成此数组并按如下方式计算元素。
numprimes = numel(primes(1000000))
numprimes = 78498.
f = @()numel(primes(1000000));
buildInspeed = timeit(f)
BULLESEDPEED = 0.0029
为了我的目的超过足够快!
系统信息
版本info = ['matlab发布r'版本('-释放')
cpuinfo()
你需要速度?
Matlab比以往任何时候都快,将来会继续变得更快。这与改进的硬件相结合,将帮助您回答比以往更大更复杂的问题。但是,总会有更多的时间我们需要更多。您认为Matlab加速技术有用,Matlab在Matlab中更快的是什么?让我们知道
这里
。
辅助功能
功能结果= floormyisprime(n)
%函数检查n是素数
如果n <= 1
结果= false;
返回
结尾
Q =楼层(SQRT(N));
为了我= 2:q
如果地板(n / i)== n / i
结果= false;
返回
结尾
结尾
结果=真实;
结尾
功能res = floormycountprimes(max_n)
%计数有多少次近摄的次数和包括max_n
res = 0;
为了i = 2:max_n
如果floormyisprime(i)
Res = Res + 1;
结尾
结尾
结尾
功能结果= uint32myisprime(n)
%函数检查n是素数
如果n <= 1
结果= false;
返回
结尾
Q =楼层(SQRT(N));
n = uint32(n);
为了i = uint32(2):q
如果mod(n,i)== 0
结果= false;
返回
结尾
结尾
结果=真实;
结尾
功能RES = UINT32MYCOUNTPRIMES(MAX_N)
%计数有多少次近摄的次数和包括max_n
res = 0;
为了i = 2:max_n
如果Uint32myisprime(i)
Res = Res + 1;
结尾
结尾
结尾
版权所有2021 Mathworks,Inc。
|
注释
要发表评论,请点击这里登录您的MathWorks帐户或创建新的。