<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>