我在循环中测量一些代码
fps = zeros(1, 100);
for i=1:100
t = tic
I = fetch_image_from_source(); % function to get image
fps(i) = 1./ toc(t);
end
plot(fps);
我得到平均50 fps。
然后我想将imshow()
添加到我的代码中。我了解imshow
非常慢,但我不会在imshow
命令中包含tic-toc
:
fps = zeros(1, 100);
figure;
for i=1:100
t = tic
I = fetch_image_from_source(); % function to get image
fps(i) = 1./ toc(t);
imshow(I); drawnow;
end
plot(fps);
我的fps速度提高了约20%-30%。为什么会这样?因为imshow()
位于tic-toc
答案 0 :(得分:4)
以下是关于时间的matlab's doc,以及当前在matlab中测量的时间和时间。我们可以读到“ tic和toc [提供]最高的准确性和最可预测的行为”。我认为这是有效的陈述。
此处观察到的性能下降并非由于经过时间的不良衡量,而与使用imshow
或drawnow
函数无关。我认为它与缓存系统有关。
下图显示了四次测试的结果,每次测试都有自己的tic/toc
基线测量(以蓝色绘制)100次迭代。绿线表示不同条件下的表现:
(1) for ii=1:100
t = tic; %single tic/toc
fps(ii,2) = 1./toc(t);
rand(1000); %extra function outside tic/toc
end
正如你的问题中所报道的,我们可以观察到每秒较慢的帧数(FPS;我会说30%),尽管rand
在tic / toc块之外。额外函数可以是任何类型(plot
,surf
,imshow
,sum
),您将始终观察到性能下降。
(2) for ii=1:100
t = tic; %first tic/toc
fps(ii,2) = 1./toc(t);
t = tic; %second tic/toc
fps(ii,2) = 1./toc(t);
rand(1000); %extra function outside tic/toc
end
在第二个子图中,tic / toc块重复两次。因此,fps
测量执行两次,并且仅保留第二测量。我们看到性能下降不再存在 - 就像第一个tic / toc调用准备第二个(热身)一样。我在缓存方面解释了这一点:执行指令和/或数据,然后保存在低级别内存中 - 第二次调用更快。
(3) for ii=1:100
t = tic; %first tic/toc
fps(ii,2) = 1./toc(t);
for ij = 1:10000 %10,000 extra tic/toc
tic;
tmp = toc;
end
end
第三个子图在单个调用场景中使用10,000 tic / toc作为额外函数。你可以看到性能几乎相同。此子图中的整组数据/指令仅与tic / toc相关 - 再次,具有快速缓存访问权限。
(4) for ii=1:100 %first tic/toc block
t = tic;
fps(ii,1) = 1./toc(t);
end
for ii=1:100 %second tic/toc block
t = tic;
fps(ii,2) = 1./toc(t);
end
最后,第四个子图显示了两个连续的tic / toc调用块。我们可以看到第二个比第一个表现更好(预热效果)。
此处显示的整体模式与imshow
无关,不依赖于JIT
的{{1}},而只取决于对特定函数的连续调用。我用缓存来解释这一点,但我缺乏某种形式的证据。
以下是情节
和代码
accel
答案 1 :(得分:3)
这可能是由于您的处理器具有多线程功能。
MATLAB使用的计算线程数基于maxNumCompThreads
的值。如果将其设置为1
,那么理论上两种情况都应该产生相同的fps。
你可以这样做:
LASTN = maxNumCompThreads(N);
此处N
应为1
,LASTN
将为您提供之前最大数量的计算线程,以后您可能需要重置首选项。