RFR(s): 8078463: optimize java/util/Map/Collisions.java
Daniel Fuchs
daniel.fuchs at oracle.com
Thu May 14 08:22:58 UTC 2015
Hi Stuart,
On 5/14/15 3:44 AM, Stuart Marks wrote:
> Hi all,
>
> Please review this change to optimize a test. Basically the test did
> string formatting for every assertion, but the string was thrown away
> if the assertion passed -- the most common case. The change is to do
> the string formatting only when an assertion fails and information
> needs to be printed out.
>
> Thanks to Andrey Zakharov for discovering and investigating this.
>
> Bug report:
>
> https://bugs.openjdk.java.net/browse/JDK-8078463
>
> Webrev:
>
> http://cr.openjdk.java.net/~smarks/reviews/8078463/webrev.0/
>
> On my (new, fast) laptop, with JVM options -Xcomp -XX:+DeoptimizeALot
> -client, the unmodified test takes about 21.4 seconds to run. The
> modified test takes only 12.3 seconds.
>
> Note that I have added several overloads of check() with different
> arguments. I tried an alternative, which is a varargs version of check():
>
> static void check(boolean cond, String fmt, Object... args) {
> if (cond) {
> pass();
> } else {
> fail(String.format(fmt, args));
> }
> }
>
> This of course is much simpler code, but it took 14.2 seconds, about
> 15% slower than the proposed version. Is the simpler code worth the
> slowdown? I could go either way.
I'm curious: have you tried with using a lambda instead? changing:
394 static void check(String desc, boolean cond) {
395 if (cond) {
396 pass();
397 } else {
398 fail(desc);
399 }
400 }
into
static void check(Supplier<String> descSupplier, boolean cond) {
if (cond) {
pass();
} else {
fail(descSupplier.get())
}
}
I wonder how the performance would compare...
best regards,
-- daniel
>
> Thanks.
>
> s'marks
>
>
More information about the core-libs-dev
mailing list