Matlab tic toc准确性

时间:2013-09-02 11:06:36

标签: performance matlab profiling

我在循环中测量一些代码

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

之外

2 个答案:

答案 0 :(得分:4)

以下是关于时间的matlab's doc,以及当前在matlab中测量的时间和时间。我们可以读到“ tic和toc [提供]最高的准确性和最可预测的行为”。我认为这是有效的陈述。

此处观察到的性能下降并非由于经过时间的不良衡量,而与使用imshowdrawnow函数无关。我认为它与缓存系统有关。

下图显示了四次测试的结果,每次测试都有自己的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块之外。额外函数可以是任何类型(plotsurfimshowsum),您将始终观察到性能下降。

(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}},而只取决于对特定函数的连续调用。我用缓存来解释这一点,但我缺乏某种形式的证据。

以下是情节

enter image description here

和代码

accel

答案 1 :(得分:3)

这可能是由于您的处理器具有多线程功能。

MATLAB使用的计算线程数基于maxNumCompThreads的值。如果将其设置为1,那么理论上两种情况都应该产生相同的fps。

你可以这样做:

LASTN = maxNumCompThreads(N);

此处N应为1LASTN将为您提供之前最大数量的计算线程,以后您可能需要重置首选项。