Il 22/07/2009 02:11, Jim Graham ha scritto:
It's odd that J2DBench showed a difference since nothing you did should have affected those benchmarks. I don't think it has any benchmark which shows the impact of a pipeline validation, so your standalone test is the only one that I think addresses the issue.Rather than setting up a machine for a 72 hour run (not sure a run of what, though - J2DBench?), I'd rather see either trying to do the check with a virtual method call (Pipe.needsLoops) or just going back to the old style of initializing them in the validation branches that we know need them and we can revisit this mechanism some other time when we have the time to really figure out how to make it cheap. In particular, I have some ideas for how to make validation incredibly cheap at the cost of a few K of lookup tables per SurfaceData, but I think the scale of that is beyond us for now... ...jim
Hi Jim,I tried some more of the j2d benchmark but you're right, looks like no one of them causes a revalidate, so they are all useless for this specific case.
I implemented the method based approach. What I did was to introduce an interface that all loops implements, this interface consist of a single method that returns a boolean.
I made the implementation final everywhere to try to limit the impact of it, although I'm not sure this is 100% correct in all cases, but the impact is still too high. In my opinion we should try to go with the interface approach, it's really less costly and less complex, basically no impact at all in all the tests.
I attach two results here. The first run iterates 1000000 times, two times for warm-up, then one more time to do the actual measurement.
The second run is more "longish" :) each loop is augmented to 100000000.As I make this test and collect the stats via a script (well, attached, but it's not the coolest script in the world), I didn't make it smart enough to tell you what each JDK actually is, so this is the explanation:
OPEN_JDK0 == build 1.7.0-internal-neugens_2009_07_27_18_10-b00 contains the patch in webrew.06 (the one with the methods, linked here) OPEN_JDK1 == build 1.7.0-internal-neugens_2009_07_15_15_31-b00 is a pure JDK build OPEN_JDK2 == build 1.7.0-internal-neugens_2009_07_15_14_30-b00 is the "old" webrew.05 patch (marker interface). Finally, the webrew: http://cr.openjdk.java.net/~neugens/100068/webrev.06/ Please, ignore the ".hgignore" changes in the patch. Cheers, Mario -- Mario Torre, Software Developer, http://www.jroller.com/neugens/ aicas Allerton Interworks Computer Automated Systems GmbH Haid-und-Neu-Straße 18 * D-76131 Karlsruhe * Germany http://www.aicas.com * Tel: +49-721-663 968-44 pgp key: http://subkeys.pgp.net/ PGP Key ID: 80F240CF Fingerprint: BA39 9666 94EC 8B73 27FA FC7C 4086 63E3 80F2 40CF USt-Id: DE216375633, Handelsregister HRB 109481, AG Mannheim Geschäftsführer: Dr. James J. Hunt Please, support open standards: http://endsoftpatents.org/
start tests ---===*** ../openjdk/build/linux-amd64/bin/java: ***===--- openjdk version "1.7.0-internal" OpenJDK Runtime Environment (build 1.7.0-internal-neugens_2009_07_27_18_10-b00) OpenJDK 64-Bit Server VM (build 16.0-b05, mixed mode) ../openjdk/build/linux-amd64/bin/java -cp build/classes/ net.java.openjdk.Main 2>&1 | tee -a OPEN_JDK0.results warmed up run time in ms: 524 total time in ms: 1782 ../openjdk/build/linux-amd64/bin/java -cp build/classes/ net.java.openjdk.Main 2>&1 | tee -a OPEN_JDK0.results warmed up run time in ms: 316 total time in ms: 1366 ../openjdk/build/linux-amd64/bin/java -cp build/classes/ net.java.openjdk.Main 2>&1 | tee -a OPEN_JDK0.results warmed up run time in ms: 360 total time in ms: 1394 ../openjdk/build/linux-amd64/bin/java -cp build/classes/ net.java.openjdk.Main 2>&1 | tee -a OPEN_JDK0.results warmed up run time in ms: 444 total time in ms: 1505 ../openjdk/build/linux-amd64/bin/java -cp build/classes/ net.java.openjdk.Main 2>&1 | tee -a OPEN_JDK0.results warmed up run time in ms: 644 total time in ms: 1751 ---===*** end: ../openjdk/build/linux-amd64/bin/java ***===--- ---===*** ../openjdk-proxy/build/linux-amd64/bin/java: ***===--- openjdk version "1.7.0-internal" OpenJDK Runtime Environment (build 1.7.0-internal-neugens_2009_07_15_15_31-b00) OpenJDK 64-Bit Server VM (build 16.0-b05, mixed mode) ../openjdk-proxy/build/linux-amd64/bin/java -cp build/classes/ net.java.openjdk.Main 2>&1 | tee -a OPEN_JDK1.results warmed up run time in ms: 327 total time in ms: 1028 ../openjdk-proxy/build/linux-amd64/bin/java -cp build/classes/ net.java.openjdk.Main 2>&1 | tee -a OPEN_JDK1.results warmed up run time in ms: 331 total time in ms: 1041 ../openjdk-proxy/build/linux-amd64/bin/java -cp build/classes/ net.java.openjdk.Main 2>&1 | tee -a OPEN_JDK1.results warmed up run time in ms: 323 total time in ms: 1053 ../openjdk-proxy/build/linux-amd64/bin/java -cp build/classes/ net.java.openjdk.Main 2>&1 | tee -a OPEN_JDK1.results warmed up run time in ms: 323 total time in ms: 1032 ../openjdk-proxy/build/linux-amd64/bin/java -cp build/classes/ net.java.openjdk.Main 2>&1 | tee -a OPEN_JDK1.results warmed up run time in ms: 329 total time in ms: 1030 ---===*** end: ../openjdk-proxy/build/linux-amd64/bin/java ***===--- ---===*** ../openjdk/j2sdk-image/bin/java: ***===--- openjdk version "1.7.0-internal" OpenJDK Runtime Environment (build 1.7.0-internal-neugens_2009_07_15_14_30-b00) OpenJDK 64-Bit Server VM (build 16.0-b05, mixed mode) ../openjdk/j2sdk-image/bin/java -cp build/classes/ net.java.openjdk.Main 2>&1 | tee -a OPEN_JDK2.results warmed up run time in ms: 322 total time in ms: 1009 ../openjdk/j2sdk-image/bin/java -cp build/classes/ net.java.openjdk.Main 2>&1 | tee -a OPEN_JDK2.results warmed up run time in ms: 314 total time in ms: 1014 ../openjdk/j2sdk-image/bin/java -cp build/classes/ net.java.openjdk.Main 2>&1 | tee -a OPEN_JDK2.results warmed up run time in ms: 362 total time in ms: 1060 ../openjdk/j2sdk-image/bin/java -cp build/classes/ net.java.openjdk.Main 2>&1 | tee -a OPEN_JDK2.results warmed up run time in ms: 314 total time in ms: 993 ../openjdk/j2sdk-image/bin/java -cp build/classes/ net.java.openjdk.Main 2>&1 | tee -a OPEN_JDK2.results warmed up run time in ms: 311 total time in ms: 989 ---===*** end: ../openjdk/j2sdk-image/bin/java ***===--- ----- printing stats ----- average run for OPEN_JDK0.results (warmed up): 457.600 average run for OPEN_JDK0.results (total): 1559.600 average run for OPEN_JDK1.results (warmed up): 326.600 average run for OPEN_JDK1.results (total): 1036.800 average run for OPEN_JDK2.results (warmed up): 324.600 average run for OPEN_JDK2.results (total): 1013.000 done!
start tests ---===*** ../openjdk/build/linux-amd64/bin/java: ***===--- openjdk version "1.7.0-internal" OpenJDK Runtime Environment (build 1.7.0-internal-neugens_2009_07_27_18_10-b00) OpenJDK 64-Bit Server VM (build 16.0-b05, mixed mode) ../openjdk/build/linux-amd64/bin/java -cp build/classes/ net.java.openjdk.Main 2>&1 | tee -a OPEN_JDK0.results warmed up run time in ms: 35356 total time in ms: 105396 ../openjdk/build/linux-amd64/bin/java -cp build/classes/ net.java.openjdk.Main 2>&1 | tee -a OPEN_JDK0.results warmed up run time in ms: 35187 total time in ms: 103188 ../openjdk/build/linux-amd64/bin/java -cp build/classes/ net.java.openjdk.Main 2>&1 | tee -a OPEN_JDK0.results warmed up run time in ms: 33524 total time in ms: 100966 ../openjdk/build/linux-amd64/bin/java -cp build/classes/ net.java.openjdk.Main 2>&1 | tee -a OPEN_JDK0.results warmed up run time in ms: 34879 total time in ms: 103055 ../openjdk/build/linux-amd64/bin/java -cp build/classes/ net.java.openjdk.Main 2>&1 | tee -a OPEN_JDK0.results warmed up run time in ms: 37043 total time in ms: 112005 ---===*** end: ../openjdk/build/linux-amd64/bin/java ***===--- ---===*** ../openjdk-proxy/build/linux-amd64/bin/java: ***===--- openjdk version "1.7.0-internal" OpenJDK Runtime Environment (build 1.7.0-internal-neugens_2009_07_15_15_31-b00) OpenJDK 64-Bit Server VM (build 16.0-b05, mixed mode) ../openjdk-proxy/build/linux-amd64/bin/java -cp build/classes/ net.java.openjdk.Main 2>&1 | tee -a OPEN_JDK1.results warmed up run time in ms: 34894 total time in ms: 104436 ../openjdk-proxy/build/linux-amd64/bin/java -cp build/classes/ net.java.openjdk.Main 2>&1 | tee -a OPEN_JDK1.results warmed up run time in ms: 34867 total time in ms: 103690 ../openjdk-proxy/build/linux-amd64/bin/java -cp build/classes/ net.java.openjdk.Main 2>&1 | tee -a OPEN_JDK1.results warmed up run time in ms: 35277 total time in ms: 104062 ../openjdk-proxy/build/linux-amd64/bin/java -cp build/classes/ net.java.openjdk.Main 2>&1 | tee -a OPEN_JDK1.results warmed up run time in ms: 36161 total time in ms: 105954 ../openjdk-proxy/build/linux-amd64/bin/java -cp build/classes/ net.java.openjdk.Main 2>&1 | tee -a OPEN_JDK1.results warmed up run time in ms: 33262 total time in ms: 103427 ---===*** end: ../openjdk-proxy/build/linux-amd64/bin/java ***===--- ---===*** ../openjdk/j2sdk-image/bin/java: ***===--- openjdk version "1.7.0-internal" OpenJDK Runtime Environment (build 1.7.0-internal-neugens_2009_07_15_14_30-b00) OpenJDK 64-Bit Server VM (build 16.0-b05, mixed mode) ../openjdk/j2sdk-image/bin/java -cp build/classes/ net.java.openjdk.Main 2>&1 | tee -a OPEN_JDK2.results warmed up run time in ms: 34405 total time in ms: 103029 ../openjdk/j2sdk-image/bin/java -cp build/classes/ net.java.openjdk.Main 2>&1 | tee -a OPEN_JDK2.results warmed up run time in ms: 34290 total time in ms: 101899 ../openjdk/j2sdk-image/bin/java -cp build/classes/ net.java.openjdk.Main 2>&1 | tee -a OPEN_JDK2.results warmed up run time in ms: 34120 total time in ms: 101077 ../openjdk/j2sdk-image/bin/java -cp build/classes/ net.java.openjdk.Main 2>&1 | tee -a OPEN_JDK2.results warmed up run time in ms: 33162 total time in ms: 98356 ../openjdk/j2sdk-image/bin/java -cp build/classes/ net.java.openjdk.Main 2>&1 | tee -a OPEN_JDK2.results warmed up run time in ms: 32535 total time in ms: 99612 ---===*** end: ../openjdk/j2sdk-image/bin/java ***===--- ----- printing stats ----- average run for OPEN_JDK0.results (warmed up): 35197.800 average run for OPEN_JDK0.results (total): 104922.000 average run for OPEN_JDK1.results (warmed up): 34892.200 average run for OPEN_JDK1.results (total): 104313.800 average run for OPEN_JDK2.results (warmed up): 33702.400 average run for OPEN_JDK2.results (total): 100794.600 done!
package net.java.openjdk; import java.awt.AlphaComposite; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.image.BufferedImage; import javax.swing.JFrame; /** * Very simple microbenchmark to test performance impact in changes * caused by OpenJDK bug #100068. * * @author Mario Torre <neug...@aicas.com> */ public class Main { /** * @param args the command line arguments */ public static void main(String[] args) { BufferedImage bimg = new BufferedImage(100, 100, BufferedImage.TRANSLUCENT); Graphics2D g = bimg.createGraphics(); long _start = System.currentTimeMillis(); for (int i = 0; i < 100000000; i++) { g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF); g.fillRect(0,0,1,1); } for (int i = 0; i < 100000000; i++) { g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF); g.fillRect(0,0,1,1); } long start = System.currentTimeMillis(); for (int i = 0; i < 100000000; i++) { g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF); g.fillRect(0,0,1,1); } long stop = System.currentTimeMillis(); System.out.println("warmed up run time in ms: " + (stop - start)); System.out.println("total time in ms: " + (stop - _start)); } }
run_tests.sh
Description: application/shellscript