Hi Peter, I tried on my linux laptop (i7 + nvidia binary driver) and my results are the same on OpenJDK 8 / 11:
*- Java: 1.8.0_181 25.181-b13oct. 09, 2018 4:29:31 PM polylinetest.Canvas paintComponentINFOS: Paint Time: 0,078soct. 09, 2018 4:29:31 PM polylinetest.Canvas paintComponentINFOS: Paint Time: 0,032s* *- Java: 11 11+28oct. 09, 2018 4:33:17 PM polylinetest.Canvas paintComponentINFO: Paint Time: 0,058soct. 09, 2018 4:33:17 PM polylinetest.Canvas paintComponentINFO: Paint Time: 0,03s* Maybe it is related to your hardware, as such graphics calls should be handled direclty by the accelerated pipelines ... XRender on linux. Here are netbeans hotspots: Name Self Time Self Time (CPU) Total Time Total Time (CPU) Hits sun.java2d.xr.XRRenderer$XRDrawHandler.drawLine (int, int, int, int) 599 ms (8,9 %) 599 ms (39 %) 702 ms (0,8 %) 702 ms (1,3 %) 393 sun.java2d.xr.XRBackendNative.XRenderRectanglesNative[native] (int, byte, short, short, short, short, int[], int) 327 ms (4,9 %) 327 ms (21,3 %) 327 ms (0,4 %) 327 ms (0,6 %) 21 sun.java2d.loops.ProcessPath.doProcessPath (sun.java2d.loops.ProcessPath.ProcessHandler, java.awt.geom.Path2D.Float, float, float) 109 ms (1,6 %) 109 ms (7,1 %) 836 ms (0,9 %) 836 ms (1,5 %) 21 sun.java2d.xr.XRDrawLine.rasterizeLine (sun.java2d.xr.GrowableRectArray, int, int, int, int, int, int, int, int, boolean, boolean) 85,1 ms (1,3 %) 85,1 ms (5,5 %) 103 ms (0,1 %) 103 ms (0,2 %) 458 sun.awt.X11.XInputMethod.createXICNative[native] (long) 46,9 ms (0,7 %) 46,9 ms (3,1 %) 46,9 ms (0,1 %) 46,9 ms (0,1 %) 1 java.awt.geom.Path2D$Float.needRoom (boolean, int) 45,2 ms (0,7 %) 45,2 ms (2,9 %) 76,7 ms (0,1 %) 76,7 ms (0,1 %) 30 java.util.Arrays.copyOf (float[], int) 21,9 ms (0,3 %) 21,9 ms (1,4 %) 23,0 ms (0 %) 23,0 ms (0 %) 28 sun.java2d.xr.GrowableIntArray.growArray () 20,5 ms (0,3 %) 20,5 ms (1,3 %) 21,0 ms (0 %) 21,0 ms (0 %) 4 sun.java2d.loops.ProcessPath$DrawProcessHandler.PROCESS_LINE (int, int, int, int, boolean, int[]) 10,3 ms (0,2 %) 10,3 ms (0,7 %) 716 ms (0,8 %) 716 ms (1,3 %) 391 Peter, what is your hardware & OS info ? Laurent PS: I made few modifs in your code: diff --git a/src/polylinetest/Canvas.java b/src/polylinetest/Canvas.java index 8aad48c..a355e18 100644 --- a/src/polylinetest/Canvas.java +++ b/src/polylinetest/Canvas.java @@ -1,17 +1,26 @@ package polylinetest; +import java.awt.Color; +import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; import java.util.Random; import java.util.logging.Level; import java.util.logging.Logger; -import javax.swing.JComponent; +import javax.swing.JPanel; +import javax.swing.Timer; -public class Canvas extends JComponent { +public class Canvas extends JPanel { public static int SIZEGRADE = 16; public Canvas() { + super(); + setPreferredSize(new Dimension(300, 200)); + setBackground(Color.WHITE); + Random rnd = new Random(); int len = 1 << SIZEGRADE; xs = new int[len]; @@ -20,6 +29,19 @@ public class Canvas extends JComponent { xs[i] = rnd.nextInt(640); ys[i] = rnd.nextInt(480); } + final Timer t = new Timer(100, new ActionListener() { + int count = 0; + @Override + public void actionPerformed(ActionEvent e) { + repaint(); + count++; + if (count > 20) { + System.exit(0); + } + } + }); + t.setRepeats(true); + t.start(); } @Override diff --git a/src/polylinetest/PolylineTest.java b/src/polylinetest/PolylineTest.java index 61c9e10..636c3b7 100644 --- a/src/polylinetest/PolylineTest.java +++ b/src/polylinetest/PolylineTest.java @@ -1,14 +1,29 @@ package polylinetest; +import java.awt.BorderLayout; import javax.swing.JFrame; +import javax.swing.JPanel; public class PolylineTest { + public static void main(String[] args) { - JFrame frame = new JFrame("polyline test"); - frame.setSize(640, 480); - frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - frame.getContentPane().add(new Canvas()); - javax.swing.SwingUtilities.invokeLater(() -> frame.setVisible(true)); + System.out.println("Java: "+System.getProperty("java.version") + " " + System.getProperty("java.vm.version")); + + javax.swing.SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + JFrame frame = new JFrame("polyline test"); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + JPanel panel = new JPanel(new BorderLayout()); + panel.add(new Canvas(), BorderLayout.CENTER); + + frame.getContentPane().add(panel); + + frame.pack(); + frame.setVisible(true); + } + }); } - + } Le mar. 9 oct. 2018 à 15:29, Peter Hull <peterhul...@gmail.com> a écrit : > I posted this message first on Java Discuss and was asked to file a Java > bug. It was also suggested I post it here for discussion. > > I've recently started using Java 11 and noticed that drawPolyline is > much slower on my PC than it was on Java 8. > Example, simplified code: > @Override > protected void paintComponent(Graphics g) { > super.paintComponent(g); > Graphics2D graphics = (Graphics2D) g; > long starttime = System.nanoTime(); > graphics.drawPolyline(xs, ys, xs.length); > long endtime = System.nanoTime(); > Logger.getLogger(this.getClass().getName()).log(Level.INFO, > "Paint Time: {0}s", (double)(endtime-starttime) / 1.0e9); > } > where xs[] and ys[] are large (65536 points) integer arrays. On Java 8 I > get a paint time of 0.025s and on Java 11 it is 25s, i.e. factor of 1000. > > This may be related to JEP263 (HiDPI) > > I've got a recent Core i7 processor with Intel graphics, running Windows > 10. > > With VisualVM I can see that all the time goes in drawPolyline, I can't > get any more detail than that. > > I have done some experimentation with RenderingHints but nothing makes the > JDK11 go as fast as JDK8. > > Is there anything else I can try to either improve matters or to provide a > clearer idea of why there is such a difference? > > I have a self-contained NetBeans project if anyone wants to try to see > they can reproduce this. > https://github.com/pedro-w/PolylineTest.git > > Thanks, > Peter > > > Versions: > openjdk version "11" 2018-09-25 > OpenJDK Runtime Environment 18.9 (build 11+28) > OpenJDK 64-Bit Server VM 18.9 (build 11+28, mixed mode) > > openjdk version "1.8.0-adoptopenjdk" > OpenJDK Runtime Environment (build > 1.8.0-adoptopenjdk-_2018_05_19_00_59-b00) > OpenJDK 64-Bit Server VM (build 25.71-b00, mixed mode) > > -- -- Laurent Bourgès