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));
    }

}

Attachment: run_tests.sh
Description: application/shellscript

Reply via email to