<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style type="text/css" style="display:none;"> P {margin-top:0;margin-bottom:0;} </style>
</head>
<body dir="ltr">
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
Hi all,</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<br>
</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
I've made a micro-benchmark to check how much the use of a character literal as an argument of std::string::find outperforms the use of a single character string literal:</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<pre><code><span>#include</span><span> </span><span><string></span><span>
</span><span>#include</span><span> </span><span><chrono></span><span>
</span><span>#include</span><span> </span><span><iostream></span><span>

</span><span>int</span><span> main</span><span>()</span><span> </span><span>{</span><span>
    </span><span>int</span><span> res </span><span>=</span><span> </span><span>0</span><span>;</span><span>
    std</span><span>::</span><span>string s</span><span>(</span><span>STRING_LITERAL</span><span>);</span><span>

    </span><span>auto</span><span> start </span><span>=</span><span> std</span><span>::</span><span>chrono</span><span>::</span><span>steady_clock</span><span>::</span><span>now</span><span>();</span><span>

    </span><span>for</span><span>(</span><span>int</span><span> i </span><span>=</span><span> </span><span>0</span><span>;</span><span> i </span><span><</span><span> </span><span>10000000</span><span>;</span><span> i</span><span>++)</span><span> </span><span>{</span><span>
</span><span>#ifdef</span><span> CHAR_TEST
        res </span><span>+=</span><span> s</span><span>.</span><span>find</span><span>(</span><span>'A'</span><span>);</span><span>
</span><span>#else</span><span>  
        res </span><span>+=</span><span> s</span><span>.</span><span>find</span><span>(</span><span>"A"</span><span>);</span><span>
</span><span>#endif</span><span>
    </span><span>}</span><span>

    </span><span>auto</span><span> end </span><span>=</span><span> std</span><span>::</span><span>chrono</span><span>::</span><span>steady_clock</span><span>::</span><span>now</span><span>();</span><span>

    std</span><span>::</span><span>chrono</span><span>::</span><span>duration</span><span><double></span><span> elapsed_seconds </span><span>=</span><span> end</span><span>-</span><span>start</span><span>;</span><span>
    std</span><span>::</span><span>cout </span><span><<</span><span> </span><span>"elapsed time: "</span><span> </span><span><<</span><span> elapsed_seconds</span><span>.</span><span>count</span><span>()</span><span> </span><span><<</span><span> </span><span>"s\n"</span><span>;</span><span>

    </span><span>return</span><span> res</span><span>;</span><span>
</span><span>}</span></code></pre>
However, I have better performance with single character string literal when the std::string contains a small string and my program is compiled with -O3:</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<pre><code><span>></span><span> </span><span>(</span><span>echo </span><span>"char with small string"</span><span> </span><span>;</span><span> clang++</span><span> </span><span>-</span><span>DSTRING_LITERAL</span><span>=</span><span>\"BAB\" </span><span>-</span><span>DCHAR_TEST </span><span>-</span><span>O3 </span><span>-</span><span>o bench_exe bench</span><span>.</span><span>cpp </span><span>&&</span><span> </span><span>./bench_exe</span><span>)</span><span> </span><span>;</span><span> </span><span>(</span><span>echo </span><span>"string literal with small string"</span><span> </span><span>;</span><span> clang++</span><span> </span><span>-</span><span>DSTRING_LITERAL</span><span>=</span><span>\"BAB\" </span><span>-</span><span>O3 </span><span>-</span><span>o bench_exe bench</span><span>.</span><span>cpp </span><span>&&</span><span> </span><span>./bench_exe</span><span>)</span><span></span></code></pre>
<pre><code><span>char</span><span> with small string
elapsed time</span><span>:</span><span> </span><span>0.0551678s</span><span>
string literal with small string
elapsed time</span><span>:</span><span> </span><span>0.0493302s</span></code></pre>
I'm using the 8.0.0 version of clang:</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<span>> clang++ --version<br>
</span>
<div>clang version 8.0.0 <br>
</div>
<div>Target: x86_64-unknown-linux-gnu<br>
</div>
<span>Thread model: posix</span></div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<br>
</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
I can reproduce this results on all of my run. On average, the use of a single character string literal give me a 10% performance improvement.</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<br>
</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
My question is: is the use of a character literal as argument of std::string::find always faster whatever the optimization level and the size of the string?</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<br>
</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
Thanks.<br>
</div>
</body>
</html>