<!-- HTML header for doxygen 1.8.7--> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <meta http-equiv="X-UA-Compatible" content="IE=9"/> <meta name="generator" content="Doxygen 1.6.3"/> <!--BEGIN PROJECT_NAME--><title>avr-libc: avr-libc: Benchmarks</title><!--END PROJECT_NAME--> <!--BEGIN !PROJECT_NAME--><title>avr-libc: Benchmarks</title><!--END !PROJECT_NAME--> <link href="$relpath^tabs.css" rel="stylesheet" type="text/css"/> <script type="text/javascript" src="$relpath^jquery.js"></script> <script type="text/javascript" src="$relpath^dynsections.js"></script> $treeview $search $mathjax <link href="$relpath^$stylesheet" rel="stylesheet" type="text/css" /> $extrastylesheet </head> <body> <div id="top"><!-- do not remove this div, it is closed by doxygen! --> <!--BEGIN TITLEAREA--> <div id="titlearea"> <table cellspacing="0" cellpadding="0"> <tbody> <tr style="height: 56px;"> <!--BEGIN PROJECT_LOGO--> <td id="projectlogo"><img alt="Logo" src="$relpath^$projectlogo"/></td> <!--END PROJECT_LOGO--> <!--BEGIN PROJECT_NAME--> <td style="padding-left: 0.5em;"> <div id="projectname">avr-libc <!--BEGIN PROJECT_NUMBER--> <span id="projectnumber">2.0.0</span><!--END PROJECT_NUMBER--> </div> <!--BEGIN PROJECT_BRIEF--><div id="projectbrief">$projectbrief</div><!--END PROJECT_BRIEF--> </td> <!--END PROJECT_NAME--> <!--BEGIN !PROJECT_NAME--> <!--BEGIN PROJECT_BRIEF--> <td style="padding-left: 0.5em;"> <div id="projectbrief">$projectbrief</div> </td> <!--END PROJECT_BRIEF--> <!--END !PROJECT_NAME--> <!--BEGIN DISABLE_INDEX--> <!--BEGIN SEARCHENGINE--> <td>$searchbox</td> <!--END SEARCHENGINE--> <!--END DISABLE_INDEX--> </tr> </tbody> </table> <table> <tr> <td align="left"><a href="http://www.nongnu.org/avr-libc/"><h2>AVR Libc Home Page</h2></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/"><h2>AVR Libc Development Pages</h2></a></td> </tr> <tr> <td align="center" width="20%"><a href="index.html"><h2>Main Page</h2></a></td> <td align="center" width="20%"><a href="pages.html"><h2>User Manual</h2></a></td> <td align="center" width="20%"><a href="modules.html"><h2>Library Reference</h2></a></td> <td align="center" width="20%"><a href="FAQ.html"><h2>FAQ</h2></a></td> <td align="center" width="20%"><a href="group__demos.html"><h2>Example Projects</h2></a></td> </tr> </table> </div> <!--END TITLEAREA--> <!-- end header part --> <!-- Generated by Doxygen 1.6.3 --> <script type="text/javascript"><!-- var searchBox = new SearchBox("searchBox", "search",false,'Search'); --></script> <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.7.1</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 class="doxtable"> <tr> <td width="50%"><b>Function</b> </td><td width="20%"><b>Units</b> </td><td width="10%"><b>Avr2</b> </td><td width="10%"><b>Avr25</b> </td><td width="10%"><b>Avr4</b> </td></tr> <tr> <td>atoi ("12345") </td><td>Flash bytes<br/> Stack bytes<br/> MCU clocks </td><td>82 (82)<br/> 2<br/> 155 </td><td>78 (78)<br/> 2<br/> 149 </td><td>74 (74)<br/> 2<br/> 149 </td></tr> <tr> <td>atol ("12345") </td><td>Flash bytes<br/> Stack bytes<br/> MCU clocks </td><td>122 (122)<br/> 2<br/> 221 </td><td>118 (118)<br/> 2<br/> 219 </td><td>118 (118)<br/> 2<br/> 219 </td></tr> <tr> <td>dtostre (1.2345, s, 6, 0) </td><td>Flash bytes<br/> Stack bytes<br/> MCU clocks </td><td>1116 (1004)<br/> 17<br/> 1247 </td><td>1048 (938)<br/> 17<br/> 1105 </td><td>1048 (938)<br/> 17<br/> 1105 </td></tr> <tr> <td>dtostrf (1.2345, 15, 6, s) </td><td>Flash bytes<br/> Stack bytes<br/> MCU clocks </td><td>1616 (1616)<br/> 38<br/> 1634 </td><td>1508 (1508)<br/> 38<br/> 1462 </td><td>1508 (1508)<br/> 38<br/> 1462 </td></tr> <tr> <td>itoa (12345, s, 10) </td><td>Flash bytes<br/> Stack bytes<br/> MCU clocks </td><td>110 (110)<br/> 2<br/> 879 </td><td>102 (102)<br/> 2<br/> 875 </td><td>102 (102)<br/> 2<br/> 875 </td></tr> <tr> <td>ltoa (12345L, s, 10) </td><td>Flash bytes<br/> Stack bytes<br/> MCU clocks </td><td>134 (134)<br/> 2<br/> 1597 </td><td>126 (126)<br/> 2<br/> 1593 </td><td>126 (126)<br/> 2<br/> 1593 </td></tr> <tr> <td>malloc (1) </td><td>Flash bytes<br/> Stack bytes<br/> MCU clocks </td><td>768 (712)<br/> 6<br/> 215 </td><td>714 (660)<br/> 6<br/> 201 </td><td>714 (660)<br/> 6<br/> 201 </td></tr> <tr> <td>realloc ((void *)0, 1) </td><td>Flash bytes<br/> Stack bytes<br/> MCU clocks </td><td>1284 (1172)<br/> 18<br/> 305 </td><td>1174 (1064)<br/> 18<br/> 286 </td><td>1174 (1064)<br/> 18<br/> 286 </td></tr> <tr> <td>qsort (s, sizeof(s), 1, cmp) </td><td>Flash bytes<br/> Stack bytes<br/> MCU clocks </td><td>1252 (1140)<br/> 42<br/> 21996 </td><td>1022 (912)<br/> 42<br/> 19905 </td><td>1028 (918)<br/> 42<br/> 17541 </td></tr> <tr> <td>sprintf_min (s, "%d", 12345) </td><td>Flash bytes<br/> Stack bytes<br/> MCU clocks </td><td>1224 (1112)<br/> 53<br/> 1841 </td><td>1092 (982)<br/> 53<br/> 1694 </td><td>1088 (978)<br/> 53<br/> 1689 </td></tr> <tr> <td>sprintf (s, "%d", 12345) </td><td>Flash bytes<br/> Stack bytes<br/> MCU clocks </td><td>1614 (1502)<br/> 58<br/> 1647 </td><td>1476 (1366)<br/> 58<br/> 1552 </td><td>1454 (1344)<br/> 58<br/> 1547 </td></tr> <tr> <td>sprintf_flt (s, "%e", 1.2345) </td><td>Flash bytes<br/> Stack bytes<br/> MCU clocks </td><td>3228 (3116)<br/> 67<br/> 2573 </td><td>2990 (2880)<br/> 67<br/> 2311 </td><td>2968 (2858)<br/> 67<br/> 2311 </td></tr> <tr> <td>sscanf_min ("12345", "%d", &i) </td><td>Flash bytes<br/> Stack bytes<br/> MCU clocks </td><td>1532 (1420)<br/> 55<br/> 1607 </td><td>1328 (1218)<br/> 55<br/> 1446 </td><td>1328 (1218)<br/> 55<br/> 1446 </td></tr> <tr> <td>sscanf ("12345", "%d", &i) </td><td>Flash bytes<br/> Stack bytes<br/> MCU clocks </td><td>2008 (1896)<br/> 55<br/> 1610 </td><td>1748 (1638)<br/> 55<br/> 1449 </td><td>1748 (1638)<br/> 55<br/> 1449 </td></tr> <tr> <td>sscanf ("point,color", "%[a-z]", s) </td><td>Flash bytes<br/> Stack bytes<br/> MCU clocks </td><td>2008 (1896)<br/> 86<br/> 3067 </td><td>1748 (1638)<br/> 86<br/> 2806 </td><td>1748 (1638)<br/> 86<br/> 2806 </td></tr> <tr> <td>sscanf_flt ("1.2345", "%e", &x) </td><td>Flash bytes<br/> Stack bytes<br/> MCU clocks </td><td>3464 (3352)<br/> 71<br/> 2497 </td><td>3086 (2976)<br/> 71<br/> 2281 </td><td>3070 (2960)<br/> 71<br/> 2078 </td></tr> <tr> <td>strtod ("1.2345", &p) </td><td>Flash bytes<br/> Stack bytes<br/> MCU clocks </td><td>1632 (1520)<br/> 20<br/> 1235 </td><td>1536 (1426)<br/> 20<br/> 1177 </td><td>1480 (1480)<br/> 21<br/> 1124 </td></tr> <tr> <td>strtol ("12345", &p, 0) </td><td>Flash bytes<br/> Stack bytes<br/> MCU clocks </td><td>918 (806)<br/> 22<br/> 956 </td><td>834 (724)<br/> 22<br/> 891 </td><td>792 (792)<br/> 28<br/> 794 </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 class="doxtable"> <tr> <td width="50%"><b>Function</b> </td><td width="25%"><b>Avr2</b> </td><td width="25%"><b>Avr4</b> </td></tr> <tr> <td>__addsf3 (1.234, 5.678) </td><td>113 </td><td>108 </td></tr> <tr> <td>__mulsf3 (1.234, 5.678) </td><td>375 </td><td>138 </td></tr> <tr> <td>__divsf3 (1.234, 5.678) </td><td>466 </td><td>465 </td></tr> <tr> <td>acos (0.54321) </td><td>4411 </td><td>2455 </td></tr> <tr> <td>asin (0.54321) </td><td>4517 </td><td>2556 </td></tr> <tr> <td>atan (0.54321) </td><td>4710 </td><td>2271 </td></tr> <tr> <td>atan2 (1.234, 5.678) </td><td>5270 </td><td>2857 </td></tr> <tr> <td>cbrt (1.2345) </td><td>2684 </td><td>2555 </td></tr> <tr> <td>ceil (1.2345) </td><td>177 </td><td>177 </td></tr> <tr> <td>cos (1.2345) </td><td>3387 </td><td>1671 </td></tr> <tr> <td>cosh (1.2345) </td><td>4922 </td><td>2979 </td></tr> <tr> <td>exp (1.2345) </td><td>4708 </td><td>2765 </td></tr> <tr> <td>fdim (5.678, 1.234) </td><td>111 </td><td>111 </td></tr> <tr> <td>floor (1.2345) </td><td>180 </td><td>180 </td></tr> <tr> <td>fmax (1.234, 5.678) </td><td>39 </td><td>37 </td></tr> <tr> <td>fmin (1.234, 5.678) </td><td>35 </td><td>35 </td></tr> <tr> <td>fmod (5.678, 1.234) </td><td>131 </td><td>131 </td></tr> <tr> <td>frexp (1.2345, 0) </td><td>42 </td><td>41 </td></tr> <tr> <td>hypot (1.234, 5.678) </td><td>1341 </td><td>866 </td></tr> <tr> <td>ldexp (1.2345, 6) </td><td>42 </td><td>42 </td></tr> <tr> <td>log (1.2345) </td><td>4142 </td><td>2134 </td></tr> <tr> <td>log10 (1.2345) </td><td>4498 </td><td>2260 </td></tr> <tr> <td>modf (1.2345, 0) </td><td>433 </td><td>429 </td></tr> <tr> <td>pow (1.234, 5.678) </td><td>9293 </td><td>5047 </td></tr> <tr> <td>round (1.2345) </td><td>150 </td><td>150 </td></tr> <tr> <td>sin (1.2345) </td><td>3353 </td><td>1653 </td></tr> <tr> <td>sinh (1.2345) </td><td>4946 </td><td>3003 </td></tr> <tr> <td>sqrt (1.2345) </td><td>494 </td><td>492 </td></tr> <tr> <td>tan (1.2345) </td><td>4381 </td><td>2426 </td></tr> <tr> <td>tanh (1.2345) </td><td>5126 </td><td>3173 </td></tr> <tr> <td>trunc (1.2345) </td><td>178 </td><td>178 </td></tr> </table> </div> <!--- window showing the filter options --> <div id="MSearchSelectWindow" onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> <a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Data Structures</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark"> </span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark"> </span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark"> </span>Typedefs</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark"> </span>Enumerations</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(7)"><span class="SelectionMark"> </span>Defines</a></div> <!-- iframe showing the search results (closed by default) --> <div id="MSearchResultsWindow"> <iframe src="" frameborder="0" name="MSearchResults" id="MSearchResults"> </iframe> </div> <!-- HTML footer for doxygen 1.8.7--> <!-- start footer part --> <!--BEGIN GENERATE_TREEVIEW--> <div id="nav-path" class="navpath"><!-- id is needed for treeview function! --> <ul> $navpath <li class="footer">$generatedby <a href="http://www.doxygen.org/index.html"> <img class="footer" src="$relpath^doxygen.png" alt="doxygen"/></a> 1.6.3 </li> </ul> </div> <!--END GENERATE_TREEVIEW--> <!--BEGIN !GENERATE_TREEVIEW--> <hr class="footer"/><address class="footer"><small> $generatedby  <a href="http://www.doxygen.org/index.html"> <img class="footer" src="$relpath^doxygen.png" alt="doxygen"/> </a> 1.6.3 </small></address> <!--END !GENERATE_TREEVIEW--> </body> </html>