drawow和cla函数大部分时间都在我的matlab代码中

时间:2013-10-05 00:13:51

标签: matlab optimization

我正在处理结构化网格。我用补丁显示它,我只是试图在图中添加一个类型(m,n)的文本,指示每个节点的索引。我使用文本函数,并且将来我想绘制变量的节点值(这是时变的,这就是文本函数在循环内部的原因)。我分析了代码,大部分时间花在了drawow,cla和text函数上:

drawnow                              7.882 s    51.7%
text(x(:),y(:),charINPUT(:),'C...    4.348 s    28.5% 
cla                                  2.300 s    15.1%

我在这里打开了一个帖子"Text" function very slow, bottleneck of my code,以了解是否有可能提高文本功能的性能,或者是否有更快的替代方案可用。在这里,我想弄清楚为什么drawow和cla这么慢。如果我删除cla它变得更慢:

drawnow                             42.774 s 86.2%  
text(x(:),y(:),charINPUT(:),'C...    4.638 s  9.3%

与drawow采取了很多。添加cla有帮助,但仍然很慢!

它只是一个71 x 71网格,如果你增加代码基本上卡住的单元格数。有什么建议加快这个吗? (注意:我使用补丁因为我想为每个单元格绘制一些网格数量,并且我想保持它一般,以防我移动到具有不规则多边形移动的非结构化网格,这就是为什么它的原因在踩踏的时间里。

编辑:我首先认为补丁非常快,因为它只需要几毫秒,但正如下面的评论中的grantnz所指出的那样,它实际上是在调用drawow时绘制的。如果我的代码在下面提供的代码中注释了行hpatch3 = ...,那么这是分析器的时间:

    text(x(:),y(:),charINPUT(:),'C..      4.539 s   58.4%   
    cla                                   2.285 s   29.4% 
    drawnow                               0.576 s    7.4%

因此现在事情变得有点痛苦,但仍然很慢。看起来创建和绘制补丁大约需要7秒,而创建和绘制文本大约需要8秒。主要区别在于,对于文本,时间主要用在函数本身(和cla)中,而对于补丁,它全部用于drawow。知道为什么会这样吗?有可能加快这一点吗?这是我的代码。

%define grid and grid numbering
ntimesteps = 10
DX = 10 ; %=DY
mmax = 71; %= number of nodes in x
nmax = mmax %= number of nodes in y
[ x y ] = meshgrid(0:DX:DX*(mmax-1),0:DX:DX*(mmax-1)); %grid
[ mMAT nMAT ] = meshgrid(1:mmax,1:nmax); %grid numbering

for j=1:ntimesteps    
   cla    
   %
   %display patch
   %
   cont = 0
   for m=2:mmax
       for n=2:nmax
           cont=cont+1;
           Xpatch(1:4,cont) = [ x(n-1,m-1) ; x(n-1,m) ; x(n,m) ; x(n,m-1) ] ;% ii+1 since it has the BC
           Ypatch(1:4,cont) = [ y(n-1,m-1) ; y(n-1,m) ; y(n,m) ; y(n,m-1) ] ;
           Zpatch(cont) = 1;
       end
   end
   hpatch3 = patch(Xpatch(:,:),Ypatch(:,:),Zpatch(:)');
   %
   % display node indices
   %
   charINPUT = regexp(sprintf('(%d,%d)\n',mMAT(:),nMAT(:)),'(?<=\s*)(\S*)(?=\n)','match'); % use regexp to vectorize sprintf and so avoid slow loops with sprintf
   text(x(:),y(:),charINPUT(:),'Clipping', 'on');
   set(gcf,'position',[9 40 1350 650])
   set(gcf,'PaperPositionMode','auto')
   %
   % other things  added to the plot
   %
    drawnow
end

1 个答案:

答案 0 :(得分:1)

对于您的示例,我可以通过将渲染器更改为painters

来加快x2的速度
set(gcf, 'renderer', 'painters')

根据文件

  

画家 - MATLAB使用的原始渲染方法更快   该图仅包含简单或小图形对象。

根据您的补丁在现实生活中的情况,您可能需要坚持使用zbuffer或openGL渲染器。通过使用低级OpenGL调用来放置文本对象,您可以获得更好的性能,但这将是很多工作。