Yes sorry, I meant jitter got so much worse. TieredCompilation could be a source -- I'd try turning it off to see what C2 peak is. I'm guessing your machine is otherwise quiet when you're running these benchmarks.
On Thu, Oct 2, 2014 at 4:47 PM, Peter Levart <peter.lev...@gmail.com> wrote: > > On 10/02/2014 09:28 PM, Vitaly Davidovich wrote: > > Yes, this is the version I wanted to see (i.e. where the only diff is > varargs, and not any anything else like array iteration, etc). > > Why did fillCopyLoop() get some much worse than in your prior email > though? > > > 82050640.406 (+-4055652.247) vs. 82395900.795 (+-2794747.540) > > I don't see a noticeable difference (there's a lot of jitter - didn't turn > off tiered compilation). > > Regards, Peter > > > > > > On Thu, Oct 2, 2014 at 3:12 PM, Peter Levart <peter.lev...@gmail.com> > wrote: > >> Well, if I add the following variant to the mix: >> >> private static void fillWith8Arguments(Object[] a, int pos, Object... >> args) { >> a[pos] = args[0]; >> a[pos + 1] = args[1]; >> a[pos + 2] = args[2]; >> a[pos + 3] = args[3]; >> a[pos + 4] = args[4]; >> a[pos + 5] = args[5]; >> a[pos + 6] = args[6]; >> a[pos + 7] = args[7]; >> } >> >> private static Object[] fillArrayByHand( >> Integer pos, Object[] a, >> Object a0, Object a1, Object a2, Object a3, >> Object a4, Object a5, Object a6, Object a7 >> ) { >> fillWith8Arguments(a, pos, a0, a1, a2, a3, a4, a5, a6, a7); >> return a; >> } >> >> @Benchmark >> public Object[] fillByHand() { >> return fillArrayByHand(0, target, a0, a1, a2, a3, a4, a5, a6, a7); >> } >> >> The results: >> >> Benchmark Mode Samples Score Score >> error Units >> j.t.FillArrayTest.fillArray thrpt 8 75994667.408 4169836.951 >> ops/s >> j.t.FillArrayTest.fillArrayAlt thrpt 8 142761145.565 >> 7127589.095 ops/s >> j.t.FillArrayTest.fillByHand thrpt 8 141206898.861 >> 6435932.932 ops/s >> j.t.FillArrayTest.fillCopyLoop thrpt 8 82395900.795 >> 2794747.540 ops/s >> >> >> ...show that with fillByHand, varargs array is indeed eliminated. But >> then the "helper" method is not of any help, since it's not reusable for >> different array lengths... >> >> >> Regards, Peter >> >> >> On 10/02/2014 08:54 PM, Peter Levart wrote: >> >> >> On 10/02/2014 08:42 PM, Vitaly Davidovich wrote: >> >> AFIK, varargs (up to something like 64 args) should be eliminated by EA. >> Peter, can you add another jmh test that uses varargs but doesn't call into >> System.arraycopy but uses the hand rolled version like your at method? I'm >> wondering if that makes EA not kick in. >> >> >> Hm, here is a modified benchmark (I also eliminated repeatable allocation >> of target array): >> >> >> @State(Scope.Benchmark) >> public class FillArrayTest { >> >> private Object >> a0 = new Object(), >> a1 = new Object(), >> a2 = new Object(), >> a3 = new Object(), >> a4 = new Object(), >> a5 = new Object(), >> a6 = new Object(), >> a7 = new Object(); >> >> >> private Object[] target = new Object[8]; >> >> private static void fillWithArguments(Object[] a, int pos, Object... >> args) { >> System.arraycopy(args, 0, a, pos, args.length); >> } >> >> private static Object[] fillArray( >> Integer pos, Object[] a, >> Object a0, Object a1, Object a2, Object a3, >> Object a4, Object a5, Object a6, Object a7 >> ) { >> fillWithArguments(a, pos, a0, a1, a2, a3, a4, a5, a6, a7); >> return a; >> } >> >> private static void fillWithArgumentsCopyLoop(Object[] a, int pos, >> Object... args) { >> for (int i = 0; i < args.length; i++) { >> a[i + pos] = args[i]; >> } >> } >> >> private static Object[] fillArrayCopyLoop( >> Integer pos, Object[] a, >> Object a0, Object a1, Object a2, Object a3, >> Object a4, Object a5, Object a6, Object a7 >> ) { >> fillWithArgumentsCopyLoop(a, pos, a0, a1, a2, a3, a4, a5, a6, a7); >> return a; >> } >> >> private static Object[] fillArrayAlt( >> Integer pos, Object[] a, >> Object a0, Object a1, Object a2, Object a3, >> Object a4, Object a5, Object a6, Object a7 >> ) { >> int i = pos; >> a[i++] = a0; >> a[i++] = a1; >> a[i++] = a2; >> a[i++] = a3; >> a[i++] = a4; >> a[i++] = a5; >> a[i++] = a6; >> a[i++] = a7; >> return a; >> } >> >> @Benchmark >> public Object[] fillArray() { >> return fillArray(0, target, a0, a1, a2, a3, a4, a5, a6, a7); >> } >> >> @Benchmark >> public Object[] fillCopyLoop() { >> return fillArrayCopyLoop(0, target, a0, a1, a2, a3, a4, a5, a6, >> a7); >> } >> >> @Benchmark >> public Object[] fillArrayAlt() { >> return fillArrayAlt(0, target, a0, a1, a2, a3, a4, a5, a6, a7); >> } >> } >> >> >> >> The results: >> >> >> Benchmark Mode Samples Score Score >> error Units >> j.t.FillArrayTest.fillArray thrpt 8 76534019.978 3063590.310 >> ops/s >> j.t.FillArrayTest.fillArrayAlt thrpt 8 141640280.270 7815152.038 >> ops/s >> j.t.FillArrayTest.fillCopyLoop thrpt 8 82050640.406 4055652.247 >> ops/s >> >> >> The fillCopyLoop seems a little faster. I don't know if this is because >> of possible elimination of allocation. The fillArrayAlt is still almost 2x >> as fast. >> >> Peter >> >> Sent from my phone >> On Oct 2, 2014 2:34 PM, "Peter Levart" <peter.lev...@gmail.com> wrote: >> >>> >>> On 10/02/2014 06:55 PM, Vladimir Ivanov wrote: >>> >>>> Small update: >>>> http://cr.openjdk.java.net/~vlivanov/8058892/webrev.01/ >>>> >>>> Need to reorder initialization sequence in MHI.Lazy. Initialized >>>> FILL_ARRAYS and ARRAYS are required for later MH lookups. >>>> >>>> Additional testing: >>>> * jck (api/java_lang/invoke) >>>> * jdk/java/lang/invoke, jdk/java/util/streams w/ "-ea -esa" and >>>> COMPILE_THRESHOLD={0,30} >>>> >>>> Best regards, >>>> Vladimir Ivanov >>>> >>> >>> Hi Vladimir, >>> >>> I have a comment that does not directly pertain to the code changes (the >>> initialization of arrays) but to the sub-optimal implementation of >>> "fillArray" methods I noticed by the way. While it is nice to use varargs >>> "makeArray" helper method with "array" methods to construct the array, the >>> same strategy used with "fillWithArguments" in "fillArray" methods makes a >>> redundant array that is then copied to target array and discarded. The >>> redundant copying has a price. Here's a benchmark (Aleksey, please bear >>> with me): >>> >>> @State(Scope.Benchmark) >>> public class FillArrayTest { >>> >>> private Object >>> a0 = new Object(), >>> a1 = new Object(), >>> a2 = new Object(), >>> a3 = new Object(), >>> a4 = new Object(), >>> a5 = new Object(), >>> a6 = new Object(), >>> a7 = new Object(); >>> >>> >>> private static void fillWithArguments(Object[] a, int pos, Object... >>> args) { >>> System.arraycopy(args, 0, a, pos, args.length); >>> } >>> >>> private static Object[] fillArray( >>> Integer pos, Object[] a, >>> Object a0, Object a1, Object a2, Object a3, >>> Object a4, Object a5, Object a6, Object a7 >>> ) { >>> fillWithArguments(a, pos, a0, a1, a2, a3, a4, a5, a6, a7); >>> return a; >>> } >>> >>> private static Object[] fillArrayAlt( >>> Integer pos, Object[] a, >>> Object a0, Object a1, Object a2, Object a3, >>> Object a4, Object a5, Object a6, Object a7 >>> ) { >>> int i = pos; >>> a[i++] = a0; >>> a[i++] = a1; >>> a[i++] = a2; >>> a[i++] = a3; >>> a[i++] = a4; >>> a[i++] = a5; >>> a[i++] = a6; >>> a[i++] = a7; >>> return a; >>> } >>> >>> @Benchmark >>> public Object[] fillArray() { >>> return fillArray(0, new Object[8], a0, a1, a2, a3, a4, a5, a6, >>> a7); >>> } >>> >>> @Benchmark >>> public Object[] fillArrayAlt() { >>> return fillArrayAlt(0, new Object[8], a0, a1, a2, a3, a4, a5, >>> a6, a7); >>> } >>> } >>> >>> >>> The results on my i7 with JMH arguments "-i 8 -wi 5 -f 1 -gc true": >>> >>> Benchmark Mode Samples Score Score >>> error Units >>> j.t.FillArrayTest.fillArray thrpt 8 48601447.674 >>> 5414853.634 ops/s >>> j.t.FillArrayTest.fillArrayAlt thrpt 8 90044973.732 8713725 >>> <732%208713725>.735 ops/s >>> >>> >>> So fillArrayAlt is nearly twice as fast... >>> >>> Regards, Peter >>> >>> >>> >>>> On 10/2/14, 7:52 PM, Vladimir Ivanov wrote: >>>> >>>>> http://cr.openjdk.java.net/~vlivanov/8058892/webrev.00/ >>>>> https://bugs.openjdk.java.net/browse/JDK-8058892 >>>>> >>>>> Core j.l.i classes are preloaded during VM startup in order to avoid >>>>> possible deadlock when accessing JSR292-related functionality from >>>>> multiple threads. After LF sharing-related changes, FILL_ARRAYS and >>>>> ARRAYS are initialized too early. It affects startup time & footprint >>>>> of >>>>> applications that don't use JSR292. >>>>> >>>>> The fix is to move these fields into MHI.Lazy class, thus delaying >>>>> their >>>>> initialization to the first usage of JSR292 API. >>>>> >>>>> Testing: failing test, manual (measured HelloWorld app startup time; >>>>> compared -XX:+PrintCompilation logs) >>>>> >>>>> Best regards, >>>>> Vladimir Ivanov >>>>> >>>> _______________________________________________ >>>> mlvm-dev mailing list >>>> mlvm-dev@openjdk.java.net >>>> http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev >>>> >>> >>> >> >> > >
_______________________________________________ mlvm-dev mailing list mlvm-dev@openjdk.java.net http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev