背景
我的问题是由简单的观察推动的,这有点破坏了经验丰富的MATLAB用户经常持有/做出的信念/假设:
底线:核心MATLAB功能是高效的,并且尝试使用MATLAB代码超越它是很困难的,如果不是不可能的话.
研究向量索引的性能
下面显示的示例代码是基本的:我为所有向量条目指定标量值.首先,我分配一个空向量x:
tic; x = zeros(1e8,1); toc
Elapsed time is 0.260525 seconds.
Run Code Online (Sandbox Code Playgroud)
有x,我想它所有的项目设置为相同的值.在实践中,你会采用不同的方式,例如,x = value*ones(1e8,1)但这里的重点是研究向量索引的性能.最简单的方法是写:
tic; x(:) = 1; toc
Elapsed time is 0.094316 seconds.
Run Code Online (Sandbox Code Playgroud)
我们称之为方法1(从赋值的值x).它看起来非常快(至少比内存分配更快).因为我在这里做的唯一事情就是对内存进行操作,我可以通过计算获得的有效内存带宽并将其与计算机的硬件内存带宽进行比较来估算此代码的效率:
eff_bandwidth = numel(x) * 8 bytes per double * 2 / time
Run Code Online (Sandbox Code Playgroud)
在上面,我乘以2因为除非使用SSE流,否则在存储器中设置值要求向量既可以从存储器读取也可以写入存储器.在上面的例子中:
eff_bandwidth(1) = 1e8*8*2/0.094316 = 17 Gb/s
Run Code Online (Sandbox Code Playgroud)
我的计算机的STREAM基准内存带宽约为17.9 Gb/s,所以确实如此 - 在这种情况下,MATLAB可以提供接近峰值的性能!到现在为止还挺好.
Method 1 is suitable if you want to set all …