gpt4 book ai didi

performance - Matlab tic toc 精度

转载 作者:太空宇宙 更新时间:2023-11-03 19:12:39 26 4
gpt4 key购买 nike

我正在循环测量一些代码

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 非常慢,但我不会在 tic-toc 命令中包含 imshow:

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

之外

最佳答案

这是一个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

正如您在问题中所报告的那样,尽管 rand 在 tic/toc block 之外,但我们可以观察到每秒帧数(FPS;我会说是 30%)变慢。额外的函数可以是任何类型(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 block 重复了两次。因此,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 调用 block 。我们可以看到第二个比第一个表现更好(预热效果)。

此处显示的整体模式与imshow无关,不依赖于accelJIT,而仅依赖于连续调用一个特定的功能。我从缓存的角度来解释这一点,但我缺乏某种形式的证据。

这是剧情

enter image description here

代码

%% 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]);

关于performance - Matlab tic toc 精度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18571744/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com