Need reviewer for forward port of 6815768 (File.getXXXSpace) and 6815768 (String.hashCode)
Ulf Zibis
Ulf.Zibis at gmx.de
Sat Feb 27 18:11:05 UTC 2010
Hm, hashCode7() has exactly the same program logic than hashCode1(), but
by different syntax.
hashCode8() should be worse than hashCode7(), because it loads the count
variable twice.
If you compare the byte code by javah or jclasslib bytecode viewer (very
nice tool), you will see that, am I wrong ?
-Ulf
Am 27.02.2010 18:50, schrieb Jason Mehrens:
> Here are two more variants you might want to throw into the benchmark.
>
> public int hashCode6() {
> int h = hash;
> if (h == 0 && count > 0) {
> int off = offset;
> char val[] = value;
> int len = count;
>
> for (int i = 0; i < len; i++) {
> h = 31*h + val[off++];
> }
> hash = h;
> }
> return h;
> }
>
> public int hashCode7() {
> int h = hash;
> int len;
> if (h == 0 && (len = count) > 0) {
> int off = offset;
> char val[] = value;
>
> for (int i = 0; i < len; i++) {
> h = 31*h + val[off++];
> }
> hash = h;
> }
> return h;
> }
>
> Jason
>
>
> ------------------------------------------------------------------------
> Date: Sat, 27 Feb 2010 17:00:14 +0300
> Subject: Re: Need reviewer for forward port of 6815768
> (File.getXXXSpace) and 6815768 (String.hashCode)
> From: dmitry.nadezhin at gmail.com
> To: core-libs-dev at openjdk.java.net
>
> Ulf,
>
> I ran Caliper benchmarks on different variants of hashCode().
> http://code.google.com/p/caliper/
> The results and the Caliper code are below:
>
> -Dima
>
> --------- -d32 -clien
> 0% Scenario{vm=java -d32 -client, benchmark=HashCodeEmpty} 8,85ns;
> σ=0,06ns @ 3 trials
> 8% Scenario{vm=java -d32 -client, benchmark=HashCode1Empty} 7,20ns;
> σ=0,04ns @ 3 trials
> 17% Scenario{vm=java -d32 -client, benchmark=HashCode2Empty} 7,79ns;
> σ=0,32ns @ 10 trials
> 25% Scenario{vm=java -d32 -client, benchmark=HashCode3Empty} 7,88ns;
> σ=0,31ns @ 10 trials
> 33% Scenario{vm=java -d32 -client, benchmark=HashCode4Empty} 7,92ns;
> σ=0,31ns @ 10 trials
> 42% Scenario{vm=java -d32 -client, benchmark=HashCode5Empty} 7,06ns;
> σ=0,27ns @ 10 trials
> 50% Scenario{vm=java -d32 -client, benchmark=HashCodeLong} 145,22ns;
> σ=0,68ns @ 3 trials
> 58% Scenario{vm=java -d32 -client, benchmark=HashCode1Long} 144,58ns;
> σ=0,55ns @ 3 trials
> 67% Scenario{vm=java -d32 -client, benchmark=HashCode2Long} 167,55ns;
> σ=1,58ns @ 6 trials
> 75% Scenario{vm=java -d32 -client, benchmark=HashCode3Long} 122,87ns;
> σ=0,34ns @ 3 trials
> 83% Scenario{vm=java -d32 -client, benchmark=HashCode4Long} 122,69ns;
> σ=0,36ns @ 3 trials
> 92% Scenario{vm=java -d32 -client, benchmark=HashCode5Long} 126,11ns;
> σ=0,77ns @ 3 trials
>
> benchmark ns logarithmic runtime
> HashCodeEmpty 9 X|||||||||||
> HashCode1Empty 7 X||||||||||
> HashCode2Empty 8 X|||||||||||
> HashCode3Empty 8 X|||||||||||
> HashCode4Empty 8 X|||||||||||
> HashCode5Empty 7 X||||||||||
> HashCodeLong 145 XXXXXXXXXXXXXXXXXXXXXXXXXX|||
> HashCode1Long 145 XXXXXXXXXXXXXXXXXXXXXXXXX||||
> HashCode2Long 168 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
> HashCode3Long 123 XXXXXXXXXXXXXXXXXXXXXX||||||
> HashCode4Long 123 XXXXXXXXXXXXXXXXXXXXX|||||||
> HashCode5Long 126 XXXXXXXXXXXXXXXXXXXXXX||||||
>
> vm: java -d32 -client
> --------
> -------- -d32 -server
> 0% Scenario{vm=java -d32 -server, benchmark=HashCodeEmpty} 1,69ns;
> σ=0,01ns @ 3 trials
> 8% Scenario{vm=java -d32 -server, benchmark=HashCode1Empty} 2,00ns;
> σ=0,07ns @ 10 trials
> 17% Scenario{vm=java -d32 -server, benchmark=HashCode2Empty} 1,97ns;
> σ=0,01ns @ 3 trials
> 25% Scenario{vm=java -d32 -server, benchmark=HashCode3Empty} 1,55ns;
> σ=0,01ns @ 3 trials
> 33% Scenario{vm=java -d32 -server, benchmark=HashCode4Empty} 1,54ns;
> σ=0,01ns @ 3 trials
> 42% Scenario{vm=java -d32 -server, benchmark=HashCode5Empty} 2,32ns;
> σ=0,01ns @ 3 trials
> 50% Scenario{vm=java -d32 -server, benchmark=HashCodeLong} 113,01ns;
> σ=5,69ns @ 10 trials
> 58% Scenario{vm=java -d32 -server, benchmark=HashCode1Long} 101,49ns;
> σ=0,89ns @ 3 trials
> 67% Scenario{vm=java -d32 -server, benchmark=HashCode2Long} 102,93ns;
> σ=0,26ns @ 3 trials
> 75% Scenario{vm=java -d32 -server, benchmark=HashCode3Long} 100,29ns;
> σ=0,98ns @ 3 trials
> 83% Scenario{vm=java -d32 -server, benchmark=HashCode4Long} 100,00ns;
> σ=0,94ns @ 5 trials
> 92% Scenario{vm=java -d32 -server, benchmark=HashCode5Long} 112,29ns;
> σ=1,22ns @ 10 trials
>
> benchmark ns logarithmic runtime
> HashCodeEmpty 2 |||
> HashCode1Empty 2 ||||
> HashCode2Empty 2 ||||
> HashCode3Empty 2 ||
> HashCode4Empty 2 ||
> HashCode5Empty 2 |||||
> HashCodeLong 113 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
> HashCode1Long 101 XXXXXXXXXXXXXXXXXXXXXXXXXX|||
> HashCode2Long 103 XXXXXXXXXXXXXXXXXXXXXXXXXXX||
> HashCode3Long 100 XXXXXXXXXXXXXXXXXXXXXXXXXX|||
> HashCode4Long 100 XXXXXXXXXXXXXXXXXXXXXXXXXX|||
> HashCode5Long 112 XXXXXXXXXXXXXXXXXXXXXXXXXXXXX
>
> vm: java -d32 -server
> ------
> ------ -d64 -client
> 0% Scenario{vm=java -d64 -client, benchmark=HashCodeEmpty} 1,63ns;
> σ=0,01ns @ 3 trials
> 8% Scenario{vm=java -d64 -client, benchmark=HashCode1Empty} 1,41ns;
> σ=0,01ns @ 3 trials
> 17% Scenario{vm=java -d64 -client, benchmark=HashCode2Empty} 1,40ns;
> σ=0,01ns @ 3 trials
> 25% Scenario{vm=java -d64 -client, benchmark=HashCode3Empty} 1,42ns;
> σ=0,01ns @ 3 trials
> 33% Scenario{vm=java -d64 -client, benchmark=HashCode4Empty} 1,40ns;
> σ=0,00ns @ 3 trials
> 42% Scenario{vm=java -d64 -client, benchmark=HashCode5Empty} 4,29ns;
> σ=0,11ns @ 10 trials
> 50% Scenario{vm=java -d64 -client, benchmark=HashCodeLong} 101,74ns;
> σ=0,12ns @ 3 trials
> 58% Scenario{vm=java -d64 -client, benchmark=HashCode1Long} 102,66ns;
> σ=0,91ns @ 3 trials
> 67% Scenario{vm=java -d64 -client, benchmark=HashCode2Long} 100,41ns;
> σ=0,45ns @ 3 trials
> 75% Scenario{vm=java -d64 -client, benchmark=HashCode3Long} 97,41ns;
> σ=0,57ns @ 3 trials
> 83% Scenario{vm=java -d64 -client, benchmark=HashCode4Long} 97,92ns;
> σ=0,46ns @ 3 trials
> 92% Scenario{vm=java -d64 -client, benchmark=HashCode5Long} 107,27ns;
> σ=0,97ns @ 3 trials
>
> benchmark ns logarithmic runtime
> HashCodeEmpty 2 |||
> HashCode1Empty 1 ||
> HashCode2Empty 1 ||
> HashCode3Empty 1 ||
> HashCode4Empty 1 ||
> HashCode5Empty 4 X||||||||
> HashCodeLong 102 XXXXXXXXXXXXXXXXXXXXXXXXXXXX|
> HashCode1Long 103 XXXXXXXXXXXXXXXXXXXXXXXXXXXX|
> HashCode2Long 100 XXXXXXXXXXXXXXXXXXXXXXXXXXXX|
> HashCode3Long 97 XXXXXXXXXXXXXXXXXXXXXXXXXXX||
> HashCode4Long 98 XXXXXXXXXXXXXXXXXXXXXXXXXXX||
> HashCode5Long 107 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
>
> vm: java -d64 -client
> -------
> ------ -d64 -server
> 0% Scenario{vm=java -d64 -server, benchmark=HashCodeEmpty} 1,62ns;
> σ=0,00ns @ 3 trials
> 8% Scenario{vm=java -d64 -server, benchmark=HashCode1Empty} 1,42ns;
> σ=0,00ns @ 3 trials
> 17% Scenario{vm=java -d64 -server, benchmark=HashCode2Empty} 1,42ns;
> σ=0,01ns @ 3 trials
> 25% Scenario{vm=java -d64 -server, benchmark=HashCode3Empty} 1,42ns;
> σ=0,00ns @ 3 trials
> 33% Scenario{vm=java -d64 -server, benchmark=HashCode4Empty} 1,41ns;
> σ=0,01ns @ 3 trials
> 42% Scenario{vm=java -d64 -server, benchmark=HashCode5Empty} 4,20ns;
> σ=0,03ns @ 3 trials
> 50% Scenario{vm=java -d64 -server, benchmark=HashCodeLong} 102,05ns;
> σ=0,22ns @ 3 trials
> 58% Scenario{vm=java -d64 -server, benchmark=HashCode1Long} 102,33ns;
> σ=0,62ns @ 3 trials
> 67% Scenario{vm=java -d64 -server, benchmark=HashCode2Long} 100,70ns;
> σ=0,43ns @ 3 trials
> 75% Scenario{vm=java -d64 -server, benchmark=HashCode3Long} 96,92ns;
> σ=0,90ns @ 3 trials
> 83% Scenario{vm=java -d64 -server, benchmark=HashCode4Long} 98,22ns;
> σ=0,40ns @ 3 trials
> 92% Scenario{vm=java -d64 -server, benchmark=HashCode5Long} 108,22ns;
> σ=1,45ns @ 10 trials
>
> benchmark ns logarithmic runtime
> HashCodeEmpty 2 |||
> HashCode1Empty 1 ||
> HashCode2Empty 1 ||
> HashCode3Empty 1 ||
> HashCode4Empty 1 ||
> HashCode5Empty 4 X||||||||
> HashCodeLong 102 XXXXXXXXXXXXXXXXXXXXXXXXXXXX|
> HashCode1Long 102 XXXXXXXXXXXXXXXXXXXXXXXXXXXX|
> HashCode2Long 101 XXXXXXXXXXXXXXXXXXXXXXXXXXX||
> HashCode3Long 97 XXXXXXXXXXXXXXXXXXXXXXXXXX|||
> HashCode4Long 98 XXXXXXXXXXXXXXXXXXXXXXXXXXX||
> HashCode5Long 108 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
>
> vm: java -d64 -server
> -------------
> ------------- StringHashCodeBenchmark.java
> package examples;
>
> import com.google.caliper.SimpleBenchmark;
> import java_lang.String;
>
> public class StringHashCodeBenchmark extends SimpleBenchmark {
>
> private String EMPTY = new String("");
> private String LONG = new
> String("@ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ");
>
> public int timeHashCodeEmpty(int reps) {
> int dummy = 0;
> for (int i = 0; i < reps; i++) {
> dummy += EMPTY.hashCode();
> }
> return dummy;
> }
>
> public int timeHashCode1Empty(int reps) {
> int dummy = 0;
> for (int i = 0; i < reps; i++) {
> dummy += EMPTY.hashCode1();
> }
> return dummy;
> }
>
> public int timeHashCode2Empty(int reps) {
> int dummy = 0;
> for (int i = 0; i < reps; i++) {
> dummy += EMPTY.hashCode2();
> }
> return dummy;
> }
>
> public int timeHashCode3Empty(int reps) {
> int dummy = 0;
> for (int i = 0; i < reps; i++) {
> dummy += EMPTY.hashCode3();
> }
> return dummy;
> }
>
> public int timeHashCode4Empty(int reps) {
> int dummy = 0;
> for (int i = 0; i < reps; i++) {
> dummy += EMPTY.hashCode4();
> }
> return dummy;
> }
>
> public int timeHashCode5Empty(int reps) {
> int dummy = 0;
> for (int i = 0; i < reps; i++) {
> dummy += EMPTY.hashCode5();
> }
> return dummy;
> }
>
> public int timeHashCodeLong(int reps) {
> int dummy = 0;
> for (int i = 0; i < reps; i++) {
> dummy += LONG.substring(1).hashCode();
> }
> return dummy;
> }
>
> public int timeHashCode1Long(int reps) {
> int dummy = 0;
> for (int i = 0; i < reps; i++) {
> dummy += LONG.substring(1).hashCode1();
> }
> return dummy;
> }
>
> public int timeHashCode2Long(int reps) {
> int dummy = 0;
> for (int i = 0; i < reps; i++) {
> dummy += LONG.substring(1).hashCode2();
> }
> return dummy;
> }
>
> public int timeHashCode3Long(int reps) {
> int dummy = 0;
> for (int i = 0; i < reps; i++) {
> dummy += LONG.substring(1).hashCode3();
> }
> return dummy;
> }
>
> public int timeHashCode4Long(int reps) {
> int dummy = 0;
> for (int i = 0; i < reps; i++) {
> dummy += LONG.substring(1).hashCode4();
> }
> return dummy;
> }
>
> public int timeHashCode5Long(int reps) {
> int dummy = 0;
> for (int i = 0; i < reps; i++) {
> dummy += LONG.substring(1).hashCode5();
> }
> return dummy;
> }
> }
> ----------------
>
> On Sat, Feb 27, 2010 at 2:18 AM, Ulf Zibis <Ulf.Zibis at gmx.de
> <mailto:Ulf.Zibis at gmx.de>> wrote:
>
> Am 26.02.2010 20:32, schrieb Alan Bateman:
>
> Ulf Zibis wrote:
> For these other suggestions it would be great to create
> micro-benchmarks and try our your changes.
>
> For now though, as I said, I'm just fixing the method to avoid the
> store for the empty string case.
>
>
> Here the benchmark for my different approaches on non-empty strings:
>
> hashCode() warmup = 38,227 ms
> hashCode1() warmup = 323,462 ms
> hashCode() time = 12,066 ms
> hashCode1() time = 11,620 ms
> hashCodes sum = 0
> hashCode() warmup = 34,928 ms
> hashCode1() warmup = 19,010 ms
> hashCode2() warmup = 25,938 ms
> hashCode3() warmup = 22,428 ms
> hashCode4() warmup = 22,966 ms
> hashCode5() warmup = 21,372 ms
> hashCode() time = 418,962 ms
> hashCode1() time = 306,977 ms
> hashCode2() time = 296,899 ms
> hashCode3() time = 363,364 ms
> hashCode4() time = 286,098 ms
> hashCode5() time = 269,519 ms
> hashCodes sum = -1427881024
>
> See new revision:
> https://java-nio-charset-enhanced.dev.java.net/source/browse/java-nio-charset-enhanced/branches/j7_EUC_TW/src/java/lang/String.java?rev=955&view=markup
> <https://java-nio-charset-enhanced.dev.java.net/source/browse/java-nio-charset-enhanced/branches/j7_EUC_TW/src/java/lang/String.java?rev=955&view=markup>
>
> -Ulf
>
>
>
>
>
>
> ------------------------------------------------------------------------
> Hotmail: Powerful Free email with security by Microsoft. Get it now.
> <http://clk.atdmt.com/GBL/go/201469230/direct/01/>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openjdk.java.net/pipermail/core-libs-dev/attachments/20100227/de11c82c/attachment.html>
More information about the core-libs-dev
mailing list