Performance Tip Optimizing Iteration: Difference between revisions

From Qt Wiki
Jump to navigation Jump to search
No edit summary
No edit summary
Line 1: Line 1:
[[Category:Learning]]<br />[[Category:HowTo]]<br />[[Category:Developing with Qt]]<br />[toc align_right=&quot;yes&amp;quot; depth=&quot;2&amp;quot;]
[[Category:Learning]]
[[Category:HowTo]]
[[Category:Developing with Qt]]
[toc align_right="yes" depth="2"]


= Performance Tip: Optimizing Iteration =
= Performance Tip: Optimizing Iteration =
Line 9: Line 12:
Qt allows you to use both Java-style and STL-style iterators to step through your structures. Your selection of iterator style has no performance impact, but your selection of iterator operator does.
Qt allows you to use both Java-style and STL-style iterators to step through your structures. Your selection of iterator style has no performance impact, but your selection of iterator operator does.


<code>QListIterator&amp;lt;int&amp;gt; i(list);<br />while (i.hasNext())<br /> process(i.next());<br /></code>
<code>QListIterator<int> i(list);
while (i.hasNext())
process(i.next());
</code>


''Java style iterator''
''Java style iterator''


<code>QList&amp;lt;int&amp;gt;::iterator i;<br />for (i = list.begin(); i != list.end(); ++i)<br /> process('''i);<br /></code>
<code>QList<int>::iterator i;
<br />''STL (standard template library) style iterator''
for (i = list.begin(); i != list.end(); ++i)
<br />When using STL-style iterators with a list containing complex items, execution is faster if you use the +''i operator instead of the i''+ operator. The i++ will force your loop to work on a copy of the item i.
process('''i);
<br />h2. Careful with foreach
</code>


<br />Benchmarking Qt applications indicates there is always a performance penalty to using a foreach loop as opposed to a for loop with an iterator. However, you can greatly reduce the performance penalty if you use a const iterator in your foreach loop. This can often make the performance penalty negligible, though it is never zero.
''STL (standard template library) style iterator''


<br /><code>foreach (const QString &amp;i, list)<br /> process(i);<br /></code>
When using STL-style iterators with a list containing complex items, execution is faster if you use the +''i operator instead of the i''+ operator. The i++ will force your loop to work on a copy of the item i.
<br />h2. Additional reading
 
<br />''' &quot;Iterating efficiently&amp;quot;:http://labs.trolltech.com/blogs/2009/01/23/iterating-efficiently/ - Qt Labs blog post
h2. Careful with foreach
 
 
Benchmarking Qt applications indicates there is always a performance penalty to using a foreach loop as opposed to a for loop with an iterator. However, you can greatly reduce the performance penalty if you use a const iterator in your foreach loop. This can often make the performance penalty negligible, though it is never zero.
 
 
<code>foreach (const QString &amp;i, list)
process(i);
</code>
 
h2. Additional reading
 
''' "Iterating efficiently":http://labs.trolltech.com/blogs/2009/01/23/iterating-efficiently/ - Qt Labs blog post

Revision as of 10:40, 25 February 2015

[toc align_right="yes" depth="2"]

Performance Tip: Optimizing Iteration

Here are two tips to help produce code that makes the most out of Qt internal performance.

Iterator selection

Qt allows you to use both Java-style and STL-style iterators to step through your structures. Your selection of iterator style has no performance impact, but your selection of iterator operator does.

QListIterator<int> i(list);
while (i.hasNext())
 process(i.next());

Java style iterator

QList<int>::iterator i;
for (i = list.begin(); i != list.end(); ++i)
 process('''i);

STL (standard template library) style iterator

When using STL-style iterators with a list containing complex items, execution is faster if you use the +i operator instead of the i+ operator. The i++ will force your loop to work on a copy of the item i.

h2. Careful with foreach


Benchmarking Qt applications indicates there is always a performance penalty to using a foreach loop as opposed to a for loop with an iterator. However, you can greatly reduce the performance penalty if you use a const iterator in your foreach loop. This can often make the performance penalty negligible, though it is never zero.


foreach (const QString &amp;i, list)
 process(i);

h2. Additional reading

"Iterating efficiently":http://labs.trolltech.com/blogs/2009/01/23/iterating-efficiently/ - Qt Labs blog post