这是一个关于时间的
matlab’s doc,在matlab中测量的时间是多久.我们可以看到“tic和toc [offer]最高的准确性和最可预测的行为”.我认为这是有效的声明.
在这里观察到的性能下降并不是由于对经过时间的不良测量,而是与使用imshow或drawow功能无关.我会认为它与缓存系统有关.
下图显示了四次测试的结果,每个测试都有自己的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
如您的问题所述,尽管兰特在tic / toc块之外,我们可以观察到每秒较慢的帧(FPS;我会说30%).额外的功能可以是任何类型(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的加速度,而仅取决于对特定功能的连续调用.我在缓存方面解释了这一点,但是我缺乏某种形式的证据.
这是地块
和代码
%% EXTRA FUNCTION (single call)
fps = zeros(2, 100);
% first case: 100 tic/toc
for ii=1:100
t = tic;
fps(ii,1) = 1./toc(t);
end
%second case: 100 tic/toc + additional function
for ii=1:100
t = tic;
fps(ii,2) = 1./toc(t);
% graph or scalar functions (uncomment to test)
%drawnow;
%plot(1:10)
rand(1000);
%ones(1000, 1000);
%sum(1:1000000);
%diff(1:1000000);
end
h = figure('Color','w','Position',[10 10 600 800]);
subplot(4,1,1);
plot(fps); legend({'tic/toc only','extra function'});
ylabel('FPS');
title('extra function, single call','FontSize',14);
set(gca,'FontSize',14, 'YLim', [0 3.5e5]);
%% EXTRA FUNCTION (double call)
fps = zeros(2, 100);
% first case: 100 tic/toc
for ii=1:100
t = tic;
fps(ii,1) = 1./toc(t);
end
%second case: 100 tic/toc + additional function (except tic/toc)
for ii=1:100
%first call
t = tic;
fps(ii,2) = 1./toc(t);
%second call (identical to first)
t = tic;
fps(ii,2) = 1./toc(t);
rand(1000);
end
subplot(4,1,2);
plot(fps); legend({'tic/toc only','extra function'});
ylabel('FPS');
title('extra function, double call','FontSize',14);
set(gca,'FontSize',14, 'YLim', [0 3.5e5]);
%% EXTRA FUNCTION (double call)
fps = zeros(2, 100);
% first case: 100 tic/toc
for ii=1:100
t = tic;
fps(ii,1) = 1./toc(t);
end
%second case: 100 tic/toc + 10000 tic/toc
for ii=1:100
t = tic;
fps(ii,2) = 1./toc(t);
for ij = 1:10000
tic;
tmp = toc;
end
end
subplot(4,1,3);
plot(fps); legend({'tic/toc','extra tic/toc'});
ylabel('FPS');
title('Identical function calls','FontSize',14);
set(gca,'FontSize',14, 'YLim', [0 3.5e5]);
%% TIC/TOC call twice
fps = zeros(2, 100);
% first case: 100 tic/toc
for ii=1:100
t = tic;
fps(ii,1) = 1./toc(t);
end
for ii=1:100
t = tic;
fps(ii,2) = 1./toc(t);
end
subplot(4,1,4);
plot(fps); legend({'tic/toc (1)','tic/toc (2)'});
ylabel('FPS');
title('tic/toc twice','FontSize',14);
set(gca,'FontSize',14, 'YLim', [0 3.5e5]);