<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>I/O &#8211; Undocumented Matlab</title>
	<atom:link href="https://undocumentedmatlab.com/articles/tag/io/feed" rel="self" type="application/rss+xml" />
	<link>https://undocumentedmatlab.com</link>
	<description>Professional Matlab consulting, development and training</description>
	<lastBuildDate>Wed, 17 Jun 2015 20:00:33 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.7.3</generator>
	<item>
		<title>Some Matlab performance-tuning tips</title>
		<link>https://undocumentedmatlab.com/articles/some-performance-tuning-tips?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=some-performance-tuning-tips</link>
					<comments>https://undocumentedmatlab.com/articles/some-performance-tuning-tips#comments</comments>
		
		<dc:creator><![CDATA[Yair Altman]]></dc:creator>
		<pubDate>Wed, 17 Jun 2015 20:00:33 +0000</pubDate>
				<category><![CDATA[GUI]]></category>
		<category><![CDATA[Low risk of breaking in future versions]]></category>
		<category><![CDATA[Stock Matlab function]]></category>
		<category><![CDATA[I/O]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[Pure Matlab]]></category>
		<guid isPermaLink="false">http://undocumentedmatlab.com/?p=5873</guid>

					<description><![CDATA[<p>Matlab can be made to run much faster using some simple optimization techniques. </p>
<p>The post <a rel="nofollow" href="https://undocumentedmatlab.com/articles/some-performance-tuning-tips">Some Matlab performance-tuning tips</a> appeared first on <a rel="nofollow" href="https://undocumentedmatlab.com">Undocumented Matlab</a>.</p>
<div class='yarpp-related-rss'>
<h3>Related posts:</h3><ol>
<li><a href="https://undocumentedmatlab.com/articles/tips-for-accelerating-matlab-performance" rel="bookmark" title="Tips for accelerating Matlab performance">Tips for accelerating Matlab performance </a> <small>My article on "Tips for Accelerating MATLAB Performance" was recently featured in the September 2017 Matlab newsletter digest. ...</small></li>
<li><a href="https://undocumentedmatlab.com/articles/plot-performance" rel="bookmark" title="Plot performance">Plot performance </a> <small>Undocumented inner plot mechanisms can significantly improve plotting performance ...</small></li>
<li><a href="https://undocumentedmatlab.com/articles/new-book-accelerating-matlab-performance" rel="bookmark" title="New book: Accelerating MATLAB Performance">New book: Accelerating MATLAB Performance </a> <small>Accelerating MATLAB Performance (ISBN 9781482211290) is a book dedicated to improving Matlab performance (speed). ...</small></li>
<li><a href="https://undocumentedmatlab.com/articles/matlab-java-memory-leaks-performance" rel="bookmark" title="Matlab-Java memory leaks, performance">Matlab-Java memory leaks, performance </a> <small>Internal fields of Java objects may leak memory - this article explains how to avoid this without sacrificing performance. ...</small></li>
</ol>
</div>
]]></description>
										<content:encoded><![CDATA[<p>Today&#8217;s post is about performance. My goal is to show that contrary to widespread perception, Matlab is not inherently too slow to be used for real-life programs. In fact, by taking a small amount of time (compared to the overall dev time), Matlab programs can be accelerated by a large factor. I wish to demonstrate this claim with work that I recently completed for the <a target="_blank" rel="nofollow" href="http://summit.fas.harvard.edu">Crustal Dynamics research group</a> at Harvard University. They have created interactive Matlab GUIs for earthquake hazard, visualizing deformation and motion at plate boundary zones, recorded as GPS velocities:<br />
<center><figure style="width: 600px" class="wp-caption aligncenter"><a target="_blank" href="/images/ResultManagerGUI.gif"><img fetchpriority="high" decoding="async" alt="Crustal dynamics visualization GUI" src="https://undocumentedmatlab.com/images/ResultManagerGUI_600x401.gif" title="Crustal dynamics visualization GUI" width="600" height="401" /></a><figcaption class="wp-caption-text">Crustal dynamics visualization GUI</figcaption></figure></center><br />
These GUIs served them well for several years. But when they recently tried to analyze larger problems that involved far more data, it was getting so slow that it limited their ability to interrogate the GUI results effectively and do productive science (take a look at all the data points around New Zealand in the screenshot above). This is when I stepped in to help.<br />
<span id="more-5873"></span><br />
Two main performance issues stood out above the rest: Loading the data, and displaying the textual labels of numeric slip rates.</p>
<h3 id="load">I/O: Loading data</h3>
<p>I began with optimizing the data load time. This involves loading several different data files, which have custom textual formats. Of course, had the data files been initially created in some binary format, we could load it much faster. But we were faced with an existing situation where the textual data format was a given fact. Using <a target="_blank" rel="nofollow" href="http://www.mathworks.com/help/matlab/matlab_prog/profiling-for-improving-performance.html">Matlab&#8217;s profiler</a>, it quickly emerged, as expected, that most of the time was spent parsing the text files. Two specific types of parsing were used, and they were both quite slow: reading the input files using <i><b><a target="_blank" rel="nofollow" href="http://www.mathworks.com/help/matlab/ref/textread.html">textread</a></b></i>, and parsing the input data using <i><b><a target="_blank" rel="nofollow" href="http://www.mathworks.com/help/matlab/ref/str2num.html">str2num</a></b></i>.<br />
To read the data from the files, I replaced the <i><b>textread</b></i> calls with corresponding <i><b><a target="_blank" rel="nofollow" href="http://www.mathworks.com/help/matlab/ref/textscan.html">textscan</a></b></i> ones:</p>
<pre lang='matlab'>
% Old (slow) code:
[Station.lon, Station.lat, Station.eastVel, Station.northVel, ...
 Station.eastSig, Station.northSig, Station.corr, ...
 Station.other1, Station.tog, Station.name] = textread(fileName, '%f%f%f%f%f%f%f%d%d%s');
% New (fast) code:
fid = fopen(fileName,'rt');
c = textscan(fid, '%f%f%f%f%f%f%f%d%d%s');
fclose(fid);
fn = {'lon', 'lat', 'eastVel', 'northVel', 'eastSig', 'northSig', 'corr', 'other1', 'tog', 'name'};
Station = cell2struct(c,fn,2);
</pre>
<p>To improve the performance of the <i><b>str2num</b></i> calls, I differentiated between two sub-cases:<br />
In some cases, <i><b>str2num</b></i> was simply used to round numeric input data to a certain numeric precision. I improved this by changing the <i><b>str2num</b></i> calls with corresponding calls to <i><b><a target="_blank" rel="nofollow" href="http://www.mathworks.com/help/matlab/ref/round.html">round</a></b></i> (which accepts an optional precision argument since R2014b):</p>
<pre lang='matlab'>
% Old (slow) code
Station.lon = str2num(num2str(Station.lon, '%3.3f'));
% New (fast) code
Station.lon = round(Station.lon,3);        % R2014b or newer
Station.lon = round(Station.lon*1e3)/1e3;  % R2014a or older
</pre>
<p>In other cases, <i><b>str2num</b></i> was used to convert strings into numeric values. This should normally be done using a <i><b>textscan</b></i> parameter but in this specific case this was complicated due to the way the data was formatted, which required parsing iterative blocks. Still, converting strings into numbers is far faster using <i><b><a target="_blank" rel="nofollow" href="http://www.mathworks.com/help/matlab/ref/sscanf.html">sscanf</a></b></i> than <i><b>str2num</b></i>. The down side is that <i><b>str2num</b></i> also works in certain edge-cases where <i><b>sscanf</b></i> doesn&#8217;t. For this reason, I created a utility function (<i>str2num_fast.m</i>) that uses <i><b>sscanf</b></i> where possible, and falls back to <i><b>str2num</b></i> in case of problems. I then simply replaced all calls to <i><b>str2num</b></i> in the code to <i>str2num_fast</i>:</p>
<pre lang='matlab'>
% str2num_fast - faster alternative to str2num
function data = str2num_fast(str, numCols)
    try
        % Fast code:
        str = char(str);
        str(:,end+1) = ' ';
        data = sscanf(str','%f');
        if nargin>1 && ~isempty(numCols)
            data = reshape(data,numCols,[])';
        end
    catch
        % This is much simpler but also much slower...
        data = str2num(str);
    end
end
</pre>
<p>The result: loading a medium-sized data set, which used to take 5-6 minutes (and much longer for larger data sets), now takes less than <b>1 second</b>, a speedup of x500. When you continuously load and compare different data sets, it can mean the difference between a usable and an unusable program. Not bad for starters&#8230;<br />
For many additional related techniques, read chapters 4 and 11 of my <a target="_blank" href="/books/matlab-performance"><i><b>Accelerating MATLAB Performance</b></i> book</a> (string processing and I/O, respectively), or other <a target="_blank" href="/articles/tag/performance">performance-related articles</a> on this website.</p>
<h3 id="display">Displaying data</h3>
<p>I now turned my attention to the graphic visualization aspects. As can be seen in the screenshot above, there are multiple layers of textual labels, arrows, lines and data points that can be added to the chart.<br />
It turned out that in the interest of improved performance, the various checkboxes were designed such that they merely turned the visibility of the graphic components on and off. This does indeed improve performance in the specific use-case of checking and unchecking a specific checkbox. But in the general case, it significantly <i>degrades</i> performance by adding numerous graphic handles to the plot. By just checking 3 of these checkboxes (not all of them), I found that 37365 different graphic handles were created in the plot axes. That&#8217;s a HUGE number, and it&#8217;s no surprise that adding additional visualization layers, or zooming/panning the axes, became excruciatingly slow, even when the layers were turned off (i.e., made invisible). This is because Matlab&#8217;s internal graphics engine needs to manage all these handles, even when they are not visible.<br />
The first rule of improving graphics performance is that except if the handles need to be frequently turned on/off, no graphic element should remain plotted if it is not visible. In our case, this meant that when a visualization layer&#8217;s checkbox is deselected, the corresponding handles are deleted, not made invisible (there is of course a throughput/latency tradeoff in the general case, between the recurring handle&#8217;s creation time and the performance impact of keeping numerous invisible handles):</p>
<pre lang='matlab'>
% hCheckbox is the handle of the selected/deselected checkbox
% hPlotHandles is the list of corresponding plotted graphic handles
if get(hCheckbox, 'Value') == 0
   %set(hPlotHandles, 'Visible', 'off');  % Old (slow) code
   delete(hPlotHandles);  % Faster throughput in our use-case
else
   hPlotHandles = ...
end
</pre>
<p>A related aspect is that if the axes is zoomed-in (as is often the case in this specific GUI), then there is no need to plot any graphic element which is outside the axes limits:</p>
<pre lang='matlab'>
% Old (slow) code:
text(lons, lats, labels);
% Much faster: limit the labels only to the visible axes area
hAxes = handle(gca);
validIdx = within(lons, hAxes.XLim) & within(lats, hAxes.YLim);
text(lons(validIdx), lats(validIdx), labels(validIdx,:));
function validIdx = within(data,limits)
    validIdx = data >= limits(1) & data <= limits(2);
end
</pre>
<p>Finally, in order to reduce the number of displayed graphic handles, we can unify the separate line segments into a single line that has NaN (or Inf) values interspaced between the segments. This is a very important technique, that enabled a reduction of ~7000 separate line handles into a single line, which improves both the line creation time and any subsequent axes action (e.g., zoom/pan). This is even faster than limiting the display to the axes limits (and yes, we could combine them by displaying a single line that has fewer data points that fit the axes limits, but the extra performance benefit would be negligible):</p>
<pre lang='matlab'>
% Old (slow) code:
line([Segment.lon1'; Segment.lon2'], [Segment.lat1'; Segment.lat2']);
% Faster code: limit the display to the axes limits
hAxes = handle(gca);
lonLimits = hAxes.XLim;
latLimits = hAxes.YLim;
valid = (within(Segment.lon1,lonLimits) | within(Segment.lon2,lonLimits)) & ...
        (within(Segment.lat1,latLimits) | within(Segment.lat2,latLimits));
line([Segment.lon1(valid)', Segment.lon2(valid)'], ...
     [Segment.lat1(valid)', Segment.lat2(valid)']);
% New (fastest) code:
lons = [Segment.lon1'; Segment.lon2'; nan(1,numel(Segment.lon2))];
lats = [Segment.lat1'; Segment.lat2'; nan(1,numel(Segment.lat2))];
line(lons(:), lats(:));
</pre>
<p>The result: the time for displaying the slip-rate labels in the zoomed-in Australasia region in the screenshot above was reduced from 33 seconds to 0.6 secs; displaying the residual velocity vectors was reduced from 1.63 secs to 0.02 secs -- speedups of x50-100. Again, not bad at all... The GUI is now fast enough to enable true interactivity. In Prof. Brendan Meade's words:</p>
<blockquote><p>[The GUI] is now tremendously fast with all arrow type visualizations! It's amazing and enabling us to work with large scale data sets much more efficiently.​ Simply fantastic. Just awesome... It's so fast on the load and showing the slip rates in zoom regions with large models almost instant! This is exactly what we were hoping for. This is really making a difference in terms of how fast we can do science!</p></blockquote>
<p>The technique of converting multiple lines into a single line using NaNs was <a target="_blank" rel="nofollow" href="http://blogs.mathworks.com/graphics/2015/06/09/object-creation-performance">discussed last week</a> by Mike Garrity. Users who are interested in additional ideas for improving Matlab graphics performance are encouraged to visit Mike's blog. For many additional techniques, read chapter 10 of my <a target="_blank" href="/books/matlab-performance"><i><b>Accelerating MATLAB Performance</b></i> book</a>, or other <a target="_blank" href="/articles/tag/performance">performance-related articles</a> on this website.<br />
Some other techniques for speeding up graphic objects creation that I've found useful over the years include:</p>
<ol>
<li>Avoid plotting non-visible elements, including elements that are outside the current axes limits, or have their <b>Visible</b> property set to 'off' or have a color that is the same as the axes background color.</li>
<li>Avoid plotting overlapped elements, esp. those that are occluded by non-transparent patches, or lines having the same coordinates.</li>
<li>Avoid using the <i><b>scatter</b></i> function with fewer than 100 data points – instead, duplicate these points so that <i><b>scatter</b></i> will work with more than 100 points, where vectorization kicks in (<a target="_blank" href="/articles/undocumented-scatter-plot-behavior">details</a>), or even better: <a target="_blank" href="/articles/performance-scatter-vs-line">use <i><b>line</b></i> rather than <i><b>scatter</b></i></a>.</li>
<li>Use low-level rather than high-level plotting functions – i.e., <i><b>line</b></i> instead of <i><b>scatter/plot/plot3</b></i>; <i><b>surface</b></i> instead of <i><b>surf</b></i>.</li>
<li>Avoid creating straight line with multiple data points – instead, only keep the end-points for plotting such lines. I find that this is a very common use-case, which is often overlooked and could have a significant performance impact.</li>
<li>Avoid using plot markers if possible, and use simple markers if this cannot be avoided. Various markers have different performance impacts in various situations, but '.' and 'o' are typically faster than others.</li>
<li>Use the <i><b>plot</b></i> function's input triplets format, rather than multiple calls to <i><b>plot</b></i>. For example:
<pre lang='matlab'>plot(data1x,data1y,'r', data2x,data2y,'g', data3x,data3y,'b', ...);</pre>
</li>
<li><a target="_blank" href="/articles/plot-performance">Set the axes properties to static values</a> before plotting, in order to avoid run-time dynamic computation and update of things like the limits, tick-marks etc.</li>
<li>Avoid creating legends or colorbars initially – let the user create them by clicking the corresponding toolbar icon if needed. Legends and colorbars take a second or more to create and can often be avoided in the initial display. If this cannot be avoided, then at least create <a target="_blank" href="/articles/plot-performance#Legend">static legends</a>/colorbars.</li>
<li>Only call <i><b>drawnow</b></i> once you've finished plotting. I've seen numerous cases where users call <i><b>drawnow</b></i> within the plotting loop and this has a horrendous performance impact. However, note that in some cases <i><b>drawnow</b></i> is very important (<a target="_blank" href="/articles/matlab-and-the-event-dispatch-thread-edt">example1</a>, <a target="_blank" href="/articles/solving-a-matlab-hang-problem">example2</a>).</li>
<li>Generate the plot while the figure is hidden.</li>
<li>Data-reduce the plotted data. We can program this ourselves, or use former MathWorker Tucker McClure’s <a target="_blank" rel="nofollow" href="http://www.mathworks.com/matlabcentral/fileexchange/40790-plot--big">reduce_plot utility</a> (a POTW selection) to do it for us. Data reduction is especially important when displaying images that do not need to be zoomed-in.</li>
<li>Cast image data to <i><b>uint8</b></i> before using <i><b>image</b></i> or <i><b>imagesc</b></i> to display the image.</li>
<li>Avoid clearing/deleting and then recreating the axes when we need to replot – instead, just delete the relevant axes children objects and replot in the existing axes.</li>
<li>Avoid using the <i><b>axes</b></i> function to set the focus on a specific axes – instead, set the figure's <b>CurrentAxes</b> property, or pass the axes handle directly to the plotting function.</li>
</ol>
<p>Naturally, there are certain use-cases where applicative requirements might prevent using one or more of these techniques, but in the general case I find that following them improves performance.</p>
<h3 id="conclusions">Conclusions</h3>
<p>Matlab is NOT inherently slow. It can be made to run much faster than many people assume, by simply using the built-in profiler tool, following several simple coding techniques and employing common sense. Too often I find that complains about Matlab's speed stem from the fact that not even a minimal effort was invested in trying to follow these steps. The difference between an unoptimized and optimized Matlab code can be far larger in Matlab than in other programming languages, so Matlab users should invest more time optimizing their code than they would perhaps need to do in other programming environments. The potential benefits, as I've shown above and in my book, could be enormous.<br />
MathWorks is constantly investing in making Matlab's engine faster by default, and there is certainly room for improvement in certain aspects (e.g, OOP and HG2 performance). But there will always be room for human insight to optimize performance, and we should not neglect this. Moreover, we should not blame Matlab for our failure to invest even a minimal optimization effort. MathWorks cannot (of course) say this to their users, but I don't have this limitation and I say it out loud: people should stop blaming MathWorks for everything. If you create a car with square wheels, don't complain if it doesn't drive as fast as you expect (even if its engine could indeed be improved). In this case, the customer is <i>not</i> always (or entirely) right.<br />
Perhaps it's just a matter of setting the user expectations straight: we do not expect Matlab to automatically solve our equations or generate the perfect engineering model. So too should we not expect Matlab to automatically run fast enough for our needs. Just as we expect to spend time to solve the scientific or engineering problem, so too should we spend a bit of time to optimize the code to run fast enough.<br />
Luckily, there are numerous different ways in which we can improve Matlab's performance. In fact, there are so many different ways to achieve our performance goals that we can take a pick based on aesthetic preferences and subjective experience: Some people use vectorization, others like parallelization, some others prefer to invest in smarter algorithms or faster hardware, others trade memory for performance or latency for throughput, still others display a GUI that just provides a faster impression with dynamic feedback. Even if one technique fails or is inapplicable, there are many other alternatives that we could try. Just use the profiler and some common sense and you are half-way there. Good luck!</p>
<h3 id="resources">Additional resources</h3>
<p>Interested readers can find out more information about improving Matlab's performance in my book "<a target="_blank" href="/books/matlab-performance">Accelerating MATLAB Performance</a>" (CRC Press, 2014, ISBN 978-1482211290). If you already have this book, please be kind enough to post your feedback on it on Amazon (<a target="_blank" rel="nofollow" href="http://www.amazon.com/Accelerating-MATLAB-Performance-speed-programs/product-reviews/1482211297/ref=cm_cr_if_acr_cm_cr_acr_txt?ie=UTF8&#038;linkCode=xm2&#038;showViewpoints=1&#038;tag=undocumatlab-20">link</a>), for the benefit of others.<br />
I am offering a couple of webinars about various ways to improve Matlab's run-time performance:</p>
<ul>
<li><a target="_blank" href="/courses/Matlab_Performance_Tuning_1_Webinar.pdf">Matlab performance tuning part 1</a> (3:39 hours, <a target="_blank" href="/courses/Matlab_Performance_Tuning_1_Webinar.pdf">syllabus</a>) - $195 (<a href="https://www.paypal.com/cgi-bin/webscr?cmd=_xclick&#038;currency_code=USD&#038;business=octahedron.ltd@gmail.com&#038;quantity=1&#038;amount=195&#038;item_name=Matlab+performance+1+webinar" rel="nofollow" target="_blank">buy</a>)</li>
<li><a target="_blank" href="/courses/Matlab_Performance_Tuning_2_Webinar.pdf">Matlab performance tuning part 2</a> (3:43 hours, <a target="_blank" href="/courses/Matlab_Performance_Tuning_2_Webinar.pdf">syllabus</a>) - $195 (<a href="https://www.paypal.com/cgi-bin/webscr?cmd=_xclick&#038;currency_code=USD&#038;business=octahedron.ltd@gmail.com&#038;quantity=1&#038;amount=195&#038;item_name=Matlab+performance+2+webinar" rel="nofollow" target="_blank">buy</a>)<br />
 &nbsp;&nbsp;&nbsp; ==> or buy both Matlab performance tuning webinars for only $345 (<a href="https://www.paypal.com/cgi-bin/webscr?cmd=_xclick&#038;currency_code=USD&#038;business=octahedron.ltd@gmail.com&#038;quantity=1&#038;amount=345&#038;item_name=Matlab+performance+webinars" rel="nofollow" target="_blank">buy</a>)</li>
</ul>
<p>Both the webinar videos and their corresponding slide-decks are available for download. The webinars content is based on onsite training courses that I presented at multiple client locations (<a href="/training#onsite" target="_blank">details</a>).<br />
<a href="mailto: altmany @gmail.com?subject=Matlab webinars&#038;body=Hi Yair, &#038;cc=;&#038;bcc=" rel="nofollow" target="_blank" onclick="var n='altmany'; var d='gmail.com'; window.open('mailto:'+n+'@'+d+'?subject=Matlab webinars&#038;body=Hi Yair, '); return false;"><img decoding="async" src="https://undocumentedmatlab.com/images/email-icon.png" width="32" height="22" alt="" style="vertical-align:middle;border:0"/>&nbsp;Email me</a> if you would like additional information on the webinars or my consulting, or to inquire regarding an onsite training course.</p>
<p>The post <a rel="nofollow" href="https://undocumentedmatlab.com/articles/some-performance-tuning-tips">Some Matlab performance-tuning tips</a> appeared first on <a rel="nofollow" href="https://undocumentedmatlab.com">Undocumented Matlab</a>.</p>
<div class='yarpp-related-rss'>
<h3>Related posts:</h3><ol>
<li><a href="https://undocumentedmatlab.com/articles/tips-for-accelerating-matlab-performance" rel="bookmark" title="Tips for accelerating Matlab performance">Tips for accelerating Matlab performance </a> <small>My article on "Tips for Accelerating MATLAB Performance" was recently featured in the September 2017 Matlab newsletter digest. ...</small></li>
<li><a href="https://undocumentedmatlab.com/articles/plot-performance" rel="bookmark" title="Plot performance">Plot performance </a> <small>Undocumented inner plot mechanisms can significantly improve plotting performance ...</small></li>
<li><a href="https://undocumentedmatlab.com/articles/new-book-accelerating-matlab-performance" rel="bookmark" title="New book: Accelerating MATLAB Performance">New book: Accelerating MATLAB Performance </a> <small>Accelerating MATLAB Performance (ISBN 9781482211290) is a book dedicated to improving Matlab performance (speed). ...</small></li>
<li><a href="https://undocumentedmatlab.com/articles/matlab-java-memory-leaks-performance" rel="bookmark" title="Matlab-Java memory leaks, performance">Matlab-Java memory leaks, performance </a> <small>Internal fields of Java objects may leak memory - this article explains how to avoid this without sacrificing performance. ...</small></li>
</ol>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://undocumentedmatlab.com/articles/some-performance-tuning-tips/feed</wfw:commentRss>
			<slash:comments>4</slash:comments>
		
		
			</item>
	</channel>
</rss>
