我想知道如何在给定的代码中处理瓶颈。
%% Points is an Nx3 matrix having the coordinates of N points where N ~ 10^6
Z = points(:,3)
listZ = (Z >= a & Z < b); % Bottleneck
np = sum(listZ); % For later usage
slice = points(listZ,:);
目前,对于N ~ 10^6
,np ~ 1000
和number of calls to this part of code = 1000
,瓶颈声明总共花费大约10秒钟,与我的其余代码相比,这是一大块时间。< / p>
仅针对@EitanT
请求的索引语句的示例代码的更多屏幕截图
答案 0 :(得分:8)
如果一方的平等并不重要,你可以将其重新表述为单方面的比较,它会快一个数量级:
Z = rand(1e6,3);
a=0.5; b=0.6;
c=(a+b)/2;
d=abs(a-b)/2;
tic
for k=1:100,
listZ1 = (Z >= a & Z < b); % Bottleneck
end
toc
tic
for k=1:100,
listZ2 = (abs(Z-c)<d);
end
toc
isequal(listZ1, listZ2)
返回
Elapsed time is 5.567460 seconds.
Elapsed time is 0.625646 seconds.
ans =
1
答案 1 :(得分:3)
假设最坏的情况:
&
内部没有短路你在~10秒内进行2*1e6*1e3 = 2e9
次比较。这是每秒约2亿次比较(约200 MFLOPS)。
考虑到你可以做一些1.7 GFLops on a single core,这确实看起来相当低。
您运行的是Windows 7吗?如果是这样,您检查了电源设置吗?你是在移动处理器上,所以我希望默认情况下会有一些低功耗方案生效。这允许窗口缩小处理速度,所以......检查一下。
除此之外....我真的不知道。
答案 2 :(得分:1)
尝试做这样的事情:
for i = 1:1000
x = (a >= 0.5);
x = (x < 0.6);
end
我发现它比以下更快:
for i = 1:1000
x = (a >= 0.5 & a < 0.6);
end
大约4秒钟:
Elapsed time is 0.985001 seconds. (first one)
Elapsed time is 4.888243 seconds. (second one)
我认为你放慢速度的原因是明智的&
操作。