<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"> <title>avr-libc: Benchmarks</title> <link href="dox.css" rel="stylesheet" type="text/css"> </head> <body> <center> <table width="80%"> <tr> <td align="left"><a href="http://www.nongnu.org/avr-libc/">AVR Libc Home Page</a></td> <td align="center" colspan=4><img src="avrs.png" alt="AVRs" align="middle" border="0"></td> <td align="right"><a href="https://savannah.nongnu.org/projects/avr-libc/">AVR Libc Development Pages</a></td> </tr> <tr> <td align="center" width="13%"><a href="index.html">Main Page</a></td> <td align="center" width="13%"><a href="pages.html">User Manual</a></td> <td align="center" width="13%"><a href="modules.html">Library Reference</a></td> <td align="center" width="13%"><a href="FAQ.html">FAQ</a></td> <td align="center" width="13%"><a href="globals.html">Alphabetical Index</a></td> <td align="center" width="13%"><a href="group__demos.html">Example Projects</a></td> </tr> </table> </center> <hr width="80%"> <!-- Generated by Doxygen 1.6.1 --> <div class="contents"> <h1><a class="anchor" id="benchmarks">Benchmarks </a></h1><p>The results below can only give a rough estimate of the resources necessary for using certain library functions. There is a number of factors which can both increase or reduce the effort required:</p> <ul> <li>Expenses for preparation of operands and their stack are not considered.</li> </ul> <ul> <li>In the table, the size includes all additional functions (for example, function to multiply two integers) but they are only linked from the library.</li> </ul> <ul> <li>Expenses of time of performance of some functions essentially depend on parameters of a call, for example, <a class="el" href="group__avr__stdlib.html#gafd4bf2faec43342e7ad3d2ab37bac1fe">qsort()</a> is recursive, and <a class="el" href="group__avr__stdio.html#ga6017094d9fd800fa02600d35399f2a2a">sprintf()</a> receives parameters in a stack.</li> </ul> <ul> <li>Different versions of the compiler can give a significant difference in code size and execution time. For example, the <a class="el" href="group__avr__stdlib.html#ga6c140bdd3b9bd740a1490137317caa44">dtostre()</a> function, compiled with avr-gcc 3.4.6, requires 930 bytes. After transition to avr-gcc 4.2.3, the size become 1088 bytes.</li> </ul> <h2><a class="anchor" id="bench_libc"> A few of libc functions.</a></h2> <p>Avr-gcc version is 4.2.3</p> <p>The size of function is given in view of all picked up functions. By default Avr-libc is compiled with <code>-mcall-prologues</code> option. In brackets the size without taking into account modules of a prologue and an epilogue is resulted. Both of the size can coincide, if function does not cause a prologue/epilogue.</p> <p><small> </p> <table border="1" cellspacing="3" cellpadding="3"> <tr> <td width="50%"><p><b>Function</b> </p> </td><td width="20%"><p><b>Units</b> </p> </td><td width="10%"><p><b>Avr2</b> </p> </td><td width="10%"><p><b>Avr25</b> </p> </td><td width="10%"><p><b>Avr4</b> </p> </td></tr> <tr> <td><p>atoi ("12345") </p> </td><td><p>Flash bytes<br/> Stack bytes<br/> MCU clocks </p> </td><td><p>82 (82)<br/> 2<br/> 155 </p> </td><td><p>78 (78)<br/> <br/> </p> </td><td><p>74 (74)<br/> 2<br/> 149 </p> </td></tr> <tr> <td><p>atol ("12345") </p> </td><td><p>Flash bytes<br/> Stack bytes<br/> MCU clocks </p> </td><td><p>122 (122)<br/> 2<br/> 221 </p> </td><td><p>118 (118)<br/> <br/> </p> </td><td><p>118 (118)<br/> 2<br/> 219 </p> </td></tr> <tr> <td><p>dtostre (1.2345, s, 6, 0) </p> </td><td><p>Flash bytes<br/> Stack bytes<br/> MCU clocks </p> </td><td><p>1184 (1072)<br/> 17<br/> 1313 </p> </td><td><p>1088 (978)<br/> <br/> </p> </td><td><p>1088 (978)<br/> 17<br/> 1152 </p> </td></tr> <tr> <td><p>dtostrf (1.2345, 15, 6, s) </p> </td><td><p>Flash bytes<br/> Stack bytes<br/> MCU clocks </p> </td><td><p>1676 (1564)<br/> 36<br/> 1608 </p> </td><td><p>1548 (1438)<br/> <br/> </p> </td><td><p>1548 (1438)<br/> 36<br/> 1443 </p> </td></tr> <tr> <td><p>itoa (12345, s, 10) </p> </td><td><p>Flash bytes<br/> Stack bytes<br/> MCU clocks </p> </td><td><p>150 (150)<br/> 4<br/> 1172 </p> </td><td><p>134 (134)<br/> <br/> </p> </td><td><p>134 (134)<br/> 4<br/> 1152 </p> </td></tr> <tr> <td><p>ltoa (12345L, s, 10) </p> </td><td><p>Flash bytes<br/> Stack bytes<br/> MCU clocks </p> </td><td><p>220 (220)<br/> 9<br/> 3174 </p> </td><td><p>200 (200)<br/> <br/> </p> </td><td><p>200 (200)<br/> 9<br/> 3136 </p> </td></tr> <tr> <td><p>malloc (1) </p> </td><td><p>Flash bytes<br/> Stack bytes<br/> MCU clocks </p> </td><td><p>554 (554)<br/> 4<br/> 196 </p> </td><td><p>506 (506)<br/> <br/> </p> </td><td><p>506 (506)<br/> 4<br/> 178 </p> </td></tr> <tr> <td><p>realloc ((void *)0, 1) </p> </td><td><p>Flash bytes<br/> Stack bytes<br/> MCU clocks </p> </td><td><p>1152 (1040)<br/> 20<br/> 303 </p> </td><td><p>1042 (932)<br/> <br/> </p> </td><td><p>1042 (932)<br/> 20<br/> 280 </p> </td></tr> <tr> <td><p>qsort (s, sizeof(s), 1, cmp) </p> </td><td><p>Flash bytes<br/> Stack bytes<br/> MCU clocks </p> </td><td><p>1242 (1130)<br/> 38<br/> 20914 </p> </td><td><p>990 (880)<br/> <br/> </p> </td><td><p>1008 (898)<br/> 38<br/> 16678 </p> </td></tr> <tr> <td><p>sprintf_min (s, "%d", 12345) </p> </td><td><p>Flash bytes<br/> Stack bytes<br/> MCU clocks </p> </td><td><p>1216 (1104)<br/> 59<br/> 1846 </p> </td><td><p>1090 (980)<br/> <br/> </p> </td><td><p>1086 (976)<br/> 59<br/> 1711 </p> </td></tr> <tr> <td><p>sprintf (s, "%d", 12345) </p> </td><td><p>Flash bytes<br/> Stack bytes<br/> MCU clocks </p> </td><td><p>1674 (1562)<br/> 58<br/> 1610 </p> </td><td><p>1542 (1432)<br/> <br/> </p> </td><td><p>1498 (1388)<br/> 58<br/> 1528 </p> </td></tr> <tr> <td><p>sprintf_flt (s, "%e", 1.2345) </p> </td><td><p>Flash bytes<br/> Stack bytes<br/> MCU clocks </p> </td><td><p>3334 (3222)<br/> 66<br/> 2513 </p> </td><td><p>3084 (2974)<br/> <br/> </p> </td><td><p>3040 (2930)<br/> 66<br/> 2297 </p> </td></tr> <tr> <td><p>sscanf_min ("12345", "%d", &i) </p> </td><td><p>Flash bytes<br/> Stack bytes<br/> MCU clocks </p> </td><td><p>1540 (1428)<br/> 55<br/> 1339 </p> </td><td><p>1354 (1244)<br/> <br/> </p> </td><td><p>1354 (1244)<br/> 55<br/> 1240 </p> </td></tr> <tr> <td><p>sscanf ("12345", "%d", &i) </p> </td><td><p>Flash bytes<br/> Stack bytes<br/> MCU clocks </p> </td><td><p>1950 (1838)<br/> 53<br/> 1334 </p> </td><td><p>1704 (1594)<br/> <br/> </p> </td><td><p>1704 (1594)<br/> 53<br/> 1235 </p> </td></tr> <tr> <td><p>sscanf ("point,color", "%[a-z]", s) </p> </td><td><p>Flash bytes<br/> Stack bytes<br/> MCU clocks </p> </td><td><p>1950 (1838)<br/> 87<br/> 2878 </p> </td><td><p>1704 (1594)<br/> <br/> </p> </td><td><p>1704 (1594)<br/> 87<br/> 2718 </p> </td></tr> <tr> <td><p>sscanf_flt ("1.2345", "%e", &x) </p> </td><td><p>Flash bytes<br/> Stack bytes<br/> MCU clocks </p> </td><td><p>3298 (3186)<br/> 63<br/> 2187 </p> </td><td><p>2934 (2824)<br/> <br/> </p> </td><td><p>2918 (2808)<br/> 63<br/> 1833 </p> </td></tr> <tr> <td><p>strtod ("1.2345", &p) </p> </td><td><p>Flash bytes<br/> Stack bytes<br/> MCU clocks </p> </td><td><p>1570 (1458)<br/> 22<br/> 1237 </p> </td><td><p>1472 (1362)<br/> <br/> </p> </td><td><p>1456 (1346)<br/> 22<br/> 971 </p> </td></tr> <tr> <td><p>strtol ("12345", &p, 0) </p> </td><td><p>Flash bytes<br/> Stack bytes<br/> MCU clocks </p> </td><td><p>942 (830)<br/> 29<br/> 1074 </p> </td><td><p>874 (764)<br/> <br/> </p> </td><td><p>808 (698)<br/> 21<br/> 722 </p> </td></tr> </table> <p></small></p> <h2><a class="anchor" id="bench_libm"> Math functions.</a></h2> <p>The table contains the number of MCU clocks to calculate a function with a given argument(s). The main reason of a big difference between Avr2 and Avr4 is a hardware multiplication.</p> <table border="1" cellspacing="3" cellpadding="3"> <tr> <td width="50%"><p><b>Function</b> </p> </td><td width="25%"><p><b>Avr2</b> </p> </td><td width="25%"><p><b>Avr4</b> </p> </td></tr> <tr> <td><p>__addsf3 (1.234, 5.678) </p> </td><td><p>113 </p> </td><td><p>108 </p> </td></tr> <tr> <td><p>__mulsf3 (1.234, 5.678) </p> </td><td><p>375 </p> </td><td><p>138 </p> </td></tr> <tr> <td><p>__divsf3 (1.234, 5.678) </p> </td><td><p>466 </p> </td><td><p>465 </p> </td></tr> <tr> <td><p>acos (0.54321) </p> </td><td><p>4411 </p> </td><td><p>2455 </p> </td></tr> <tr> <td><p>asin (0.54321) </p> </td><td><p>4517 </p> </td><td><p>2556 </p> </td></tr> <tr> <td><p>atan (0.54321) </p> </td><td><p>4710 </p> </td><td><p>2271 </p> </td></tr> <tr> <td><p>atan2 (1.234, 5.678) </p> </td><td><p>5270 </p> </td><td><p>2857 </p> </td></tr> <tr> <td><p>cbrt (1.2345) </p> </td><td><p>2684 </p> </td><td><p>2555 </p> </td></tr> <tr> <td><p>ceil (1.2345) </p> </td><td><p>177 </p> </td><td><p>177 </p> </td></tr> <tr> <td><p>cos (1.2345) </p> </td><td><p>3387 </p> </td><td><p>1671 </p> </td></tr> <tr> <td><p>cosh (1.2345) </p> </td><td><p>4922 </p> </td><td><p>2979 </p> </td></tr> <tr> <td><p>exp (1.2345) </p> </td><td><p>4708 </p> </td><td><p>2765 </p> </td></tr> <tr> <td><p>fdim (5.678, 1.234) </p> </td><td><p>111 </p> </td><td><p>111 </p> </td></tr> <tr> <td><p>floor (1.2345) </p> </td><td><p>180 </p> </td><td><p>180 </p> </td></tr> <tr> <td><p>fmax (1.234, 5.678) </p> </td><td><p>39 </p> </td><td><p>37 </p> </td></tr> <tr> <td><p>fmin (1.234, 5.678) </p> </td><td><p>35 </p> </td><td><p>35 </p> </td></tr> <tr> <td><p>fmod (5.678, 1.234) </p> </td><td><p>131 </p> </td><td><p>131 </p> </td></tr> <tr> <td><p>frexp (1.2345, 0) </p> </td><td><p>42 </p> </td><td><p>41 </p> </td></tr> <tr> <td><p>hypot (1.234, 5.678) </p> </td><td><p>1341 </p> </td><td><p>866 </p> </td></tr> <tr> <td><p>ldexp (1.2345, 6) </p> </td><td><p>42 </p> </td><td><p>42 </p> </td></tr> <tr> <td><p>log (1.2345) </p> </td><td><p>4142 </p> </td><td><p>2134 </p> </td></tr> <tr> <td><p>log10 (1.2345) </p> </td><td><p>4498 </p> </td><td><p>2260 </p> </td></tr> <tr> <td><p>modf (1.2345, 0) </p> </td><td><p>433 </p> </td><td><p>429 </p> </td></tr> <tr> <td><p>pow (1.234, 5.678) </p> </td><td><p>9293 </p> </td><td><p>5047 </p> </td></tr> <tr> <td><p>round (1.2345) </p> </td><td><p>150 </p> </td><td><p>150 </p> </td></tr> <tr> <td><p>sin (1.2345) </p> </td><td><p>3353 </p> </td><td><p>1653 </p> </td></tr> <tr> <td><p>sinh (1.2345) </p> </td><td><p>4946 </p> </td><td><p>3003 </p> </td></tr> <tr> <td><p>sqrt (1.2345) </p> </td><td><p>494 </p> </td><td><p>492 </p> </td></tr> <tr> <td><p>tan (1.2345) </p> </td><td><p>4381 </p> </td><td><p>2426 </p> </td></tr> <tr> <td><p>tanh (1.2345) </p> </td><td><p>5126 </p> </td><td><p>3173 </p> </td></tr> <tr> <td><p>trunc (1.2345) </p> </td><td><p>178 </p> </td><td><p>178 </p> </td></tr> </table> </div> <hr width="80%"> <p><center>Automatically generated by Doxygen 1.6.1 on 30 Nov 2009.</center></p> </body> </html>