Need reviewer for forward port of 6815768 (File.getXXXSpace) and 6815768 (String.hashCode)
Dmitry Nadezhin
dmitry.nadezhin at gmail.com
Sat Feb 27 14:00:14 UTC 2010
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> 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
>
> -Ulf
>
>
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openjdk.java.net/pipermail/core-libs-dev/attachments/20100227/995d4d1b/attachment.html>
More information about the core-libs-dev
mailing list