Matlab computation time is very high for first run
    4 vues (au cours des 30 derniers jours)
  
       Afficher commentaires plus anciens
    
Hello all, In the attached Matlab code there is one issue. If I run this code first time then computation time is in the range of 0.055 secs. But when I run the same code subsequent times (i.e. 2nd and 3rd times..) then computation time is around 0.015 secs. Can anybody please tell me, why Matlab computation time is so high in first run? I have also attached plot for computation time as a function of number of runs. Thank you in advance for your help,
Sincerely, Nik
Code:
clear all;
    for t=1:1000  
    tic
    l=10;
    k=5;
    a=-1;
    b=1;
    hh=(b-a)/(2^l);
    H=(2^k)*hh;
    ll=a-2*H;
    ul=b+2*H;
    x=a-2*H:hh:b+2*H;
    y=x;
    pH=cell(k+1,1);
    pX=cell(k+1,1);
    pY=cell(k+1,1);
    for i=1:1:k+1
        H=(2^(i-1))*hh;
        pH{i,1}=H;
        xX=ll:H:ul;
        xY=xX;
        pX{i,1}=xX;
        pY{i,1}=xY;
    end   
    nx=2^(l)+1;
    u=zeros(length(y),1);
    u(1+2^(k+1):end-2^(k+1))=(1*ones(1,nx)-(y(1+2^(k+1):end-2^(k+1)).^2));%sin(y(1+2^(k+1):end-2^(k+1))).^2;
    pU=cell(k+1,1);
    pW=cell(k+1,1);
    pRhH=cell(k,1);
    pK=cell(k+1,1);
    pU{1}=u;
    m=length(x);
    pN{1,1}=m;
    RhH=zeros((m+1)/2,m);
    RhH(1,1:4)=(1/16)*[16 9 0 -1];
    RhH(2,1:6)=(1/16)*[0 9 16 9 0 -1];
    RhH((m+1)/2-1,end-5:end)=(1/16)*[-1 0 9 16 9 0];
    RhH((m+1)/2,end-3:end)=(1/16)*[-1 0 9 16];
    %tic
    for i=3:1:(m+1)/2-2
            RhH(i,2*i-4:2*i+2)=(1/16)*[-1 0 9 16 9 0 -1];
    end
    pRhH{1}=RhH;
    for i=1:1:k
        pU{i+1,1}=(1/2)*pRhH{i}*pU{i};
        rhH=pRhH{i};
        [n,m]=size(rhH);
        pN{i+1,1}=n;
        pRhH{i+1}=rhH(1:(length(pU{i+1})+1)/2,1:length(pU{i+1}));
    end
    n=length(pU{k+1});
    K4=zeros(n,n);
    W=zeros(n,1);
    U=pU{k+1};
    %
    nm=pN{1};
    DD=zeros(1,nm+1);
    % Tt=ones(nm,1);
    % Ksuper=zeros(nm,nm);
    for i=1:1:pN{1}
        c=hh/2;d=-hh/2;
        D1= log(sqrt(((i-1)*hh-c)^2 + 2) + (i-1)*hh - c);
        D2= log(sqrt(((i-1)*hh-d)^2 + 2) + (i-1)*hh - d);
        DD(1,i)=-D1+D2;
    end
    %Perform actual integration on coarse grid
    for I=1:1:n
        for J=1:1:n
             i=(2^k)*(I-1)+1;
             j=(2^k)*(J-1)+1;
             K4(I,J)=DD(abs(i-j)+1);
            W(I)=W(I)+(H/hh)*K4(I,J)*U(J);
        end
    end
    pW{k+1,1}=W;
    pK{k+1}=K4;
    for i=k:-1:1
        T=int32(2^i);
        TT=T/2;
        n=pN{i,1};%n is the number of points on fine grid on which we will interpolate now
        m=int32(3+1*log(n));
        m=round(m);
        kl=round(m/2)+3;
        W=pW{i+1,1};
        IHh=pRhH{i,1}';
        X=pX{i+1,1};
        x=pX{i,1};
        Y=pY{i+1,1};
        y=pY{i,1};
        u=pU{i,1};
        h=pH{i,1};
        N=pN{i+1};
        %Retrieve Kernel K on coarse mesh
        KNN=pK{i+1};
        pm=length(KNN);
        if i==k
        v3=KNN((1+N)/2,-kl+(1+N)/2:kl+(1+N)/2)';
        else
        v3=KNN(-kl+(1+pm)/2:kl+(1+pm)/2);
        end 
       r=2*(2*kl+1)-1;
       Khat1=IHh(1:r,1:2*kl+1)*v3;
    %    Khat1=IHh*v3;
       pK{i,1}=Khat1;
       %Kprime1=Khat1(-m+(n+1)/2:m+(n+1)/2);
       Kprime1=Khat1(-m+(r+1)/2:m+(r+1)/2);
       K7=repmat(Kprime1,1,N);
       mm=(-m:1:m)';
       mmm=TT*abs(mm)+1;
       mM=repmat(mmm,1,N);
       K99=DD(mM);
       M=repmat(mm,1,n);
       JJ=int32(1:1:n);%2*JJ-1;
       JJ=repmat(JJ,2*m+1,1);
       JM=(JJ+M);
       u(n+1,1)=0;
       JM(JM<=0)=n+1;
       JM(JM>n)=n+1;
       U=u(JM);
       U1=U(:,1:2:end);
       U2=U(:,2:2:end-1)';
       corr=(K99-K7)'*U1;
       Correction=diag(corr);
       W=W+Correction*h/hh;
        w=IHh*W;
       K88=K99(:,1:end-1)';
       v4=TT*((n+1)/2);
       v4=v4*int32(ones(N,1));
       v5=int32(1:1:N)';
       v5=T*(v5-1);
       v6=DD(abs(v4-v5)+1);
       v7=IHh*v6';
       v8=v7(-m+(n+1)/2+1:m+(n+1)/2+1)';
       K10=repmat(v8,(n-1)/2,1);
       corr4=(K88-K10)*U2';
       corr3=diag(corr4);
       w(2:2:end-1)=w(2:2:end-1)+corr3*(h/hh);
        pW{i,1}=w;
    end
    wfine=pW{1,1};
    et(t)=toc;
    end
    mean(et)
0 commentaires
Réponses (1)
  Walter Roberson
      
      
 le 26 Mar 2018
        Code can be slower the first time it executes because MATLAB uses a Just In Time Compiler that has to execute the first time. After the first time a line is executed then MATLAB has internal data structures that are faster to execute than the first time it looks at them.
Voir également
Catégories
				En savoir plus sur Performance and Memory dans Help Center et File Exchange
			
	Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!

