5

我想知道如何在给定的代码中处理瓶颈。

%% 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 ~ 1000number of calls to this part of code = 1000,bottleneck 语句总共需要大约 10 秒,与我的其他代码相比,这是一个很大的时间。

分析结果

@EitanT 要求的仅用于索引语句的示例代码的更多屏幕截图

分析示例代码 分析示例代码

4

3 回答 3

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
于 2013-06-20T16:25:02.477 回答
3

假设最坏的情况:

  • element-wise&内部没有短路
  • 比较是单线程的

您将2*1e6*1e3 = 2e9在大约 10 秒内进行比较。这是每秒约 2 亿次比较(约 200 MFLOPS)。

考虑到您可以在单个核心上执行一些1.7 GFLops ,这确实看起来相当低。

您运行的是 Windows 7 吗?如果是这样,您是否检查过电源设置?您使用的是移动处理器,所以我希望默认情况下会有一些低功耗方案生效。这允许 Windows 降低处理速度,所以...检查一下。

除此之外......我真的不知道。

于 2013-06-20T16:11:50.870 回答
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)

我认为您放慢速度的原因是元素明智的&操作。

于 2013-06-20T15:58:34.827 回答