<div dir="ltr">The number of lines of assembly isn't really a good proxy for the performance of some code - mostly due to inlining (one piece of code may be many more lines of assembly because it's not calling large/complicated external functions - or, even taken as a whole (including those external functions) it might still be more efficient to have longer code (because it's more specialized - ie: two calls to one generic function were inlined into two places and each one simplified/optimized a bit for those situations))<br><br>That said, libc++ does have a bunch of forced inlining that's not for performance reasons, but for linkage reasons (to ensure that certain kinds of changes/updates to libc++ don't break existing compiled code/libraries). It's a tradeoff that not every user of libc++ needs to make & there are steps being taken to make that tradeoff more configurable/optional, so far as I understand it.<br><br><div class="gmail_quote"><div dir="ltr">On Mon, Jul 23, 2018 at 4:43 PM via cfe-dev <<a href="mailto:cfe-dev@lists.llvm.org">cfe-dev@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div lang="EN-US" link="#0563C1" vlink="#954F72"><div class="m_-4253775270299124572WordSection1"><p class="MsoNormal">Hello all,<u></u><u></u></p><p class="MsoNormal"><u></u> <u></u></p><p class="MsoNormal">Just a quick question to make sure I’m not missing something.<u></u><u></u></p><p class="MsoNormal"><u></u> <u></u></p><p class="MsoNormal">This program:<u></u><u></u></p><p class="MsoNormal"><u></u> <u></u></p><p class="MsoNormal"><span style="font-family:Consolas">#include <vector><u></u><u></u></span></p><p class="MsoNormal"><span style="font-family:Consolas">void f(std::vector<double>& vec, double val) {<u></u><u></u></span></p><p class="MsoNormal"><span style="font-family:Consolas">      vals.emplace(std::cbegin(vec), val);<u></u><u></u></span></p><p class="MsoNormal"><span style="font-family:Consolas">}<u></u><u></u></span></p><p class="MsoNormal"><u></u> <u></u></p><p class="MsoNormal">When compiled with trunk Clang on Godbolt with <span style="font-family:Consolas">-O3 -march=haswell -std=c++17 -stdlib=libstdc++</span>, 132 lines of assembly are produced. If <span style="font-family:Consolas">-stdlib=libc++</span> is used, though, 638 (!) lines of assembly are produced. A few of those lines are due to <span style="font-family:Consolas">f()</span> itself, but it appears the vast majority are due to the implementation of <span style="font-family:Consolas">emplace()</span>. As a partial comparison, GCC trunk produced 136 lines of assembly, and seems to have partially inlined <span style="font-family:Consolas">emplace()</span>, leaving 94 lines of assembly for <span style="font-family:Consolas">_M_realloc_insert</span>.<u></u><u></u></p><p class="MsoNormal"><u></u> <u></u></p><p class="MsoNormal">I can sort of duplicate this on Debian sid, with libc++-dev 6.0.1-1 and <span style="font-family:Consolas">clang++-7</span> (<span style="font-family:Consolas">--version</span> doesn’t appear to give a revision number, unfortunately?). Using libstdc++ results in 176 lines of assembly, and libc++ results in 803 lines of assembly (counted by <span style="font-family:Consolas">wc -l</span>).<u></u><u></u></p><p class="MsoNormal"><u></u> <u></u></p><p class="MsoNormal">Is this something to be worried about? I’m still rather new to performance-related work, so I’m working from a relatively simplistic view of what could be affecting performance. A 4x difference in what could be a commonly-used function seems rather unusual to me, though.<u></u><u></u></p><p class="MsoNormal"><u></u> <u></u></p><p class="MsoNormal">Thanks,<u></u><u></u></p><p class="MsoNormal"><u></u> <u></u></p><p class="MsoNormal">Alex<u></u><u></u></p></div></div>_______________________________________________<br>
cfe-dev mailing list<br>
<a href="mailto:cfe-dev@lists.llvm.org" target="_blank">cfe-dev@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev</a><br>
</blockquote></div></div>