<div dir="ltr"><div>The same code, but using the new standard:</div><div><a href="http://cr.openjdk.java.net/~chegar/docs/portingScript.html">http://cr.openjdk.java.net/~chegar/docs/portingScript.html</a></div><div><br></div><div><br></div><div>How is the new standard I thought that I should create new thread.</div><div>Sorry.</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Sun, Jan 25, 2015 at 10:30 PM, Claes Redestad <span dir="ltr"><<a href="mailto:claes.redestad@oracle.com" target="_blank">claes.redestad@oracle.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Wait a minute. Is this the latest? Why start a new thread?<br>
<br>
Updating your benchmark to the latest JMH and running them against the latest JDK9 I get contradictory<br>
results (repeatable on two different machines):<br>
<br>
Benchmark       (param)   Mode  Cnt     Score    Error  Units<br>
<br>
.indexOfChar    10000    thrpt   50  3875.096 ± 12.365  ops/s<br>
.indexOfString  10000    thrpt   50  4523.693 ± 9.835   ops/s<br>
<br>
JMH 1.5 version:<br>
<br>
import org.openjdk.jmh.annotations.*;<br>
import org.openjdk.jmh.infra.<u></u>Blackhole;<br>
...<br>
    private static final String WORDS = "I love java Language 8 because has Lambda, Stream and MetaSpace";<br>
<br>
    @Param("10000")<br>
    private int param;<br>
<br>
    @Benchmark<br>
    public void indexOfString(Blackhole bh) {<br>
        for (int i = 0; i <= param; i++) {<br>
            int index = WORDS.indexOf(",");<br>
            bh.consume(index);<br>
        }<br>
    }<br>
<br>
    @Benchmark<br>
    public void indexOfChar(Blackhole bh) {<br>
        for (int i = 0; i <= param; i++) {<br>
            int index = WORDS.indexOf(',');<br>
            bh.consume(index);<br>
        }<br>
    }<br>
<br>
Turning WORDS into public String words actually narrows the gap (doesn't really make sense to<br>
benchmark indexOf with a literal char/String on a literal String, IMHO):<br>
<br>
Char:   5.158 ± 0.052  ops/ms<br>
String: 5.314 ± 0.052  ops/ms<br>
<br>
Writing the benchmark like this:<br>
<br>
    public String words = "I love java Language 8 because has Lambda, Stream and MetaSpace";<br>
<br>
    @Benchmark<br>
    public int indexOfString() {<br>
        return words.indexOf(",");<br>
    }<br>
<br>
    @Benchmark<br>
    public int indexOfChar() {<br>
        return words.indexOf(',');<br>
    }<br>
<br>
shows some possible benefit:<br>
<br>
Char    50.962 ± 0.529  ops/us<br>
String  44.765 ± 0.078  ops/us<br>
<br>
Comparing with results from older JDKs, it seems something must've subtly changed - perhaps<br>
a regression somewhere. Turning off<br>
<br>
The fact that there's no indexOf(char) but rather an indexOf(int), while this area is a<br>
minefield of intrinsics makes all of this very hard to evaluate from a performance point of view.<br>
<br>
Also, I think everyone would appreciate if you could split the patch into one patch per module.<br>
That'd be a natural split and will simplify getting reviews from each appropriate team.<br>
<br>
/Claes<br>
<br>
On 2015-01-12 23:23, Otávio Gonçalves de Santana wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
These String literals may be replaced by equivalent character literals[1],<br>
gaining some performance enhancement.<br>
<br>
Webrev:<br>
<a href="https://dl.dropboxusercontent.com/u/16109193/open_jdk/jdk/index_of_character/index.html" target="_blank">https://dl.dropboxusercontent.<u></u>com/u/16109193/open_jdk/jdk/<u></u>index_of_character/index.html</a><br>
<br>
<br>
[1]<br>
@State(Scope.Thread)<br>
@OutputTimeUnit(TimeUnit.<u></u>SECONDS)<br>
public class IndexOfBenchmark {<br>
<br>
     private static final String WORDS = "I love java Language 8 because has<br>
Lambda, Stream and MetaSpace";<br>
<br>
     @Param("10000")<br>
     private int param;<br>
<br>
     @GenerateMicroBenchmark<br>
     public void indexOfString(BlackHole bh) {<br>
<br>
         for (int i = 0; i <= param; i++) {<br>
             int index = WORDS.indexOf(",");<br>
             bh.consume(index);<br>
         }<br>
     }<br>
<br>
     @GenerateMicroBenchmark<br>
     public void indexOfChar(BlackHole bh) {<br>
<br>
         for (int i = 0; i <= param; i++) {<br>
             int index = WORDS.indexOf(',');<br>
             bh.consume(index);<br>
         }<br>
     }<br>
}<br>
<br>
Benchmark                           (param)   Mode   Samples         Mean<br>
Mean error    Units<br>
m.IndexOfBenchmark.indexOfChar        10000  thrpt        10     5579.120<br>
    114.179    ops/s<br>
m.IndexOfBenchmark.<u></u>indexOfString      10000  thrpt        10     4562.178<br>
     46.751    ops/s<br>
<br>
</blockquote>
<br>
</blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature"><div dir="ltr"><div><div style="text-align:center"><div><span style="text-align:start">Otávio Gonçalves de Santana</span><div style="text-align:start"><div style="text-align:center"><br><div style="text-align:left"><font face="Tahoma">blog:     </font><a href="http://otaviosantana.blogspot.com.br/" style="text-align:center" target="_blank">http://otaviosantana.blogspot.com.br/</a></div><div style="text-align:left">twitter: <a href="http://twitter.com/otaviojava" target="_blank">http://twitter.com/otaviojava</a></div><div style="text-align:left">site:     <span style="text-align:center"><font color="#0000ee"><u><a href="http://about.me/otaviojava" target="_blank">http://about.me/otaviojava</a></u></font></span></div><div style="text-align:left">55 (11) 98255-3513</div></div></div></div></div></div></div></div>
</div>