计时码在matlab中

我用4种不同的方式写下了一个函数,我想要这个函数。

到现在我一直在做这件事情:

tic %//function 1 toc tic %//function 2 toc tic %//function 3 toc tic %//function 4 toc 

但是现在我想计算每个函数的定时数据(比如说100次),然后计算每个函数花费的平均时间。 我怎么能这样做?

另外,我在某处读到,打印的时间是经过的“挂钟”时间 – 所以在MATLAB程序运行时,它会受到我的电脑正在做的任何事情的影响。

那么有没有更好的方法呢? 我听说有一个MATLAB内置的代码分析器与命令“configuration文件”。 请任何人都可以告诉我可以使用它的方式吗?

我也咨询了这些网站: MATLAB和Profiler中的 时序代码, 以查找代码瓶颈 。

请build议如何做多次循环。 提前致谢。

编辑:2013年9月23日:按照大家的build议,我做到了这一点:我的function定义为一,二,三和四。

 function [] = one(x) I = imread('coins.png'); I = double(I); I = imresize(I,[xx]); sig=.8; % scale parameter in Gaussian kernel G=fspecial('gaussian',15,sig); % Caussian kernel Img_smooth=conv2(I,G,'same'); % smooth image by Gaussiin convolution [Ix,Iy]=gradient(Img_smooth); f=Ix.^2+Iy.^2; g=1./(1+f); % edge indicator function. end function [] = two(x) I = imread('coins.png'); I = double(I); I = imresize(I,[xx]); sig=.8; % scale parameter in Gaussian kernel G=fspecial('gaussian',15,sig); % Caussian kernel Img_smooth=imfilter(I,G,'conv'); % smooth image by Gaussiin convolution [Ix,Iy]=gradient(Img_smooth); f=Ix.^2+Iy.^2; g=1./(1+f); % edge indicator function. end function [] = three(x) I = imread('coins.png'); I = double(I); I = imresize(I,[xx]); sig=.8; % scale parameter in Gaussian kernel G=fspecial('gaussian',15,sig); % Caussian kernel %//Trying to use 1D convolution instead of using 2D convolution [U,S,V] = svd(G); K1 = U(:,1) * sqrt(S(1,1)); K2 = V(:,1)' * sqrt(S(1,1)); KI1 = imfilter(I,K1,'conv'); Img_smooth = imfilter(KI1,K2,'conv'); % smooth image by Gaussiin convolution [Ix,Iy]=gradient(Img_smooth); f=Ix.^2+Iy.^2; g=1./(1+f); % edge indicator function. end function [] = four(x) I = imread('coins.png'); I = double(I); I = imresize(I,[xx]); sig=.8; % scale parameter in Gaussian kernel G=fspecial('gaussian',15,sig); % Caussian kernel %//Trying to use 1D convolution instead of using 2D convolution [U,S,V] = svd(G); K1 = U(:,1) * sqrt(S(1,1)); K2 = V(:,1)' * sqrt(S(1,1)); KI1 = imfilter(I,K1,'conv'); Img_smooth=conv2(K1,K2,I,'same'); % smooth image by Gaussiin convolution [Ix,Iy]=gradient(Img_smooth); f=Ix.^2+Iy.^2; g=1./(1+f); % edge indicator function. end 

然后我运行这个程序,得到这个时间:

 clc;clear all;close all; x=64;N=100; tic for i=1:N one(x); end toc tic for i=1:N two(x); end toc tic for i=1:N three(x); end toc tic for i=1:N four(x); end toc 

我得到的时间是:

 %//x=64;N=100; Elapsed time is 0.898583 seconds. Elapsed time is 0.983132 seconds. Elapsed time is 0.921140 seconds. Elapsed time is 0.811144 seconds. %//x=128;N=100; Elapsed time is 0.990136 seconds. Elapsed time is 1.044167 seconds. Elapsed time is 0.999153 seconds. Elapsed time is 1.005903 seconds. %//x=256;N=100 Elapsed time is 1.495068 seconds. Elapsed time is 1.416523 seconds. Elapsed time is 1.462653 seconds. Elapsed time is 1.605767 seconds. %//x=1024;N=100 Elapsed time is 16.681720 seconds. Elapsed time is 14.857957 seconds. Elapsed time is 15.580161 seconds. Elapsed time is 19.140707 seconds. 

我的时间码错了吗? 我的意思是技术上我应该得到function三,四总是最快的时间。 对于不同的x值,我得到了不同的结果。

请大家可以build议我一个更好的时间测量方法? 提前致谢!

定时MATLAB代码的最好方法是使用timeit ,可从MATLAB Central File Exchange获得。

它是由MathWorks的高级开发人员之一Steve Eddins实现的,并且在计算代码时需要很多细微之处。 例如,代码在函数中执行而不是在脚本中执行时运行得非常不同,为了充分利用JIT编译器,需要执行几次“热身”运行。 它也会循环多次运行代码,并取中间值。

如果不知道MATLAB是如何工作的,那么这些事情就很难得到正确的解决,而timeit会为你处理这些事情 – 简单的tictoc应用程序不会。

正如其他答案所build议的那样,使用Profiler会造成问题,因为它会closuresJIT编译器的许多方面,并且不会像通常那样以相同的速度运行。 事件探查器在告诉你哪部分代码占用了相当大一部分时间,比如发现瓶颈,但并不打算给你实际的时间。

请注意,在最新版本(R2013b)中, timeit作为核心MATLAB的一部分提供,不需要从File Exchange获取。

例如,要定义oneinput参数x等于64的函数,可以input:

 myfun = @()one(64); timeit(myfun); 

这样做的function是为你的函数创build一个函数 (确保代码在一个函数中执行,如上所述),然后将这个函数句柄传递给timeit 。 输出是timeit对执行代码所花时间的估计。

分析器是一种可能性,但会显着降低代码速度。 或者,您可以将循环值存储在循环中或每次函数调用之后。

 t(i) = toc 

然后比较这些值,计算平均值或其他值,就像处理其他向量一样。

使用profiler几乎和tic / toc一样简单:

 profile on; for i=1:N your_function() end profile viewer; 

如果你的4个函数是独立的,不会相互影响,你也可以在一个块中分配所有的函数:

 profile on; for i=1:N your_function1() your_function2() your_function3() your_function4() end profile viewer; 

分析器将让你看看每一行代码的处理时间。 您可以使用挂钟或cpu时间进行基准testing,默认值为cpu-time。 请参阅profile文件文档以了解如何更改该文件。

编辑:我喜欢的分析器是,它给你每个子function的处理时间的细分 – 因此这是一个很好的方式来发现瓶颈在更大的进程。 这可能不是这里的用例。