jdk/test/sun/java2d/loops/CopyAreaSpeed.java
changeset 33244 fe43269f8575
equal deleted inserted replaced
32875:eb8e90bef9aa 33244:fe43269f8575
       
     1 /*
       
     2  * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
       
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
       
     4  *
       
     5  * This code is free software; you can redistribute it and/or modify it
       
     6  * under the terms of the GNU General Public License version 2 only, as
       
     7  * published by the Free Software Foundation.
       
     8  *
       
     9  * This code is distributed in the hope that it will be useful, but WITHOUT
       
    10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
       
    11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
       
    12  * version 2 for more details (a copy is included in the LICENSE file that
       
    13  * accompanied this code).
       
    14  *
       
    15  * You should have received a copy of the GNU General Public License version
       
    16  * 2 along with this work; if not, write to the Free Software Foundation,
       
    17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
       
    18  *
       
    19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
       
    20  * or visit www.oracle.com if you need additional information or have any
       
    21  * questions.
       
    22  */
       
    23 /*
       
    24  * @test
       
    25  * @bug 4189070
       
    26  * @summary This test prints out the time it takes for a certain amount of
       
    27  * copyArea calls to be completed. Because the performance measurement is
       
    28  * relative, this code only provides a benchmark to run with different releases
       
    29  * to compare the outcomes.
       
    30  * @run applet/manual=done CopyAreaSpeed.html
       
    31  */
       
    32 
       
    33 import java.applet.Applet;
       
    34 import java.awt.*;
       
    35 import java.awt.event.*;
       
    36 import java.util.*;
       
    37 
       
    38 public class CopyAreaSpeed extends Applet implements Runnable {
       
    39     int top = 0;
       
    40 
       
    41     public void init() {
       
    42     }
       
    43 
       
    44     public CopyAreaSpeed()
       
    45     {
       
    46         super();
       
    47         String[] instructions =
       
    48         {
       
    49             "This test prints out the time it takes for a certain amount ",
       
    50             "of copyArea calls to be completed. Because the performance ",
       
    51             "measurement is relative, this code only provides a benchmark ",
       
    52             "to run with different releases to compare the outcomes."
       
    53         };
       
    54         Sysout.createDialogWithInstructions( instructions );
       
    55         (new Thread(this)).start();
       
    56         Button bt = new Button("Hello");
       
    57         bt.setBounds(50, 10, 50, 22);
       
    58         bt.setVisible(false);
       
    59         add(bt);
       
    60     }
       
    61 
       
    62     public void update(Graphics g)
       
    63     {
       
    64         paint(g);
       
    65     }
       
    66 
       
    67     public void paint(Graphics g)
       
    68     {
       
    69         synchronized(this) {
       
    70             Rectangle rct = g.getClipBounds();
       
    71             g.setColor(Color.white);
       
    72             g.fillRect(rct.x, rct.y, rct.width, rct.height);
       
    73             g.setFont(getFont());
       
    74             g.setColor(Color.black);
       
    75 
       
    76             Dimension dm = getSize();
       
    77             for (int y = 0; y <= (dm.height + 10); y += 20) {
       
    78                 if (y > rct.y) {
       
    79                     int z = y / 20 + top;
       
    80                     g.drawString("" + z, 10, y);
       
    81                 }               /* endif */
       
    82             }                   // endfor
       
    83         }
       
    84     }
       
    85 
       
    86     static long millsec(Date s, Date e) {
       
    87         long ts = s.getTime();
       
    88         long te = e.getTime();
       
    89         return te-ts;
       
    90     }
       
    91 
       
    92     public void run()
       
    93     {
       
    94         int count = 1000;
       
    95         int loops = count;
       
    96         Date start;
       
    97         Date end;
       
    98 
       
    99         start = new Date();
       
   100         while (count-- > 0) {
       
   101             Dimension dm = getSize();
       
   102             if (dm != null && dm.width != 0 && dm.height != 0) {
       
   103                 synchronized(this) {
       
   104                     top++;
       
   105                     Graphics g = getGraphics();
       
   106                     g.copyArea(0, 20, dm.width, dm.height - 20, 0, -20);
       
   107                     g.setClip(0, dm.height - 20, dm.width, 20);
       
   108                     paint(g);
       
   109                     g.dispose();
       
   110                 }
       
   111             }
       
   112             try {
       
   113                 Thread.sleep(1);
       
   114             } catch(Exception ex) {
       
   115                 ex.printStackTrace();
       
   116             }
       
   117         }
       
   118         end = new Date();
       
   119         Sysout.println("copyArea X "+loops+" = "+ millsec(start, end) + " msec");
       
   120     }
       
   121 
       
   122     public static void main(String args[]) {
       
   123         Frame frm = new Frame("CopyAreaSpeed");
       
   124         frm.add(new CopyAreaSpeed());
       
   125         frm.addWindowListener(new WindowAdapter() {
       
   126             public void windowClosing(WindowEvent ev) {
       
   127                 System.exit(0);
       
   128             }
       
   129         });
       
   130         frm.setSize(500, 500);
       
   131         frm.show();
       
   132     }
       
   133 }
       
   134 /****************************************************
       
   135  Standard Test Machinery
       
   136  DO NOT modify anything below -- it's a standard
       
   137   chunk of code whose purpose is to make user
       
   138   interaction uniform, and thereby make it simpler
       
   139   to read and understand someone else's test.
       
   140  ****************************************************/
       
   141 
       
   142 /**
       
   143  This is part of the standard test machinery.
       
   144  It creates a dialog (with the instructions), and is the interface
       
   145   for sending text messages to the user.
       
   146  To print the instructions, send an array of strings to Sysout.createDialog
       
   147   WithInstructions method.  Put one line of instructions per array entry.
       
   148  To display a message for the tester to see, simply call Sysout.println
       
   149   with the string to be displayed.
       
   150  This mimics System.out.println but works within the test harness as well
       
   151   as standalone.
       
   152  */
       
   153 class Sysout
       
   154 {
       
   155     private static TestDialog dialog;
       
   156 
       
   157     public static void createDialogWithInstructions( String[] instructions )
       
   158     {
       
   159         dialog = new TestDialog( new Frame(), "Instructions" );
       
   160         dialog.printInstructions( instructions );
       
   161         dialog.show();
       
   162         println( "Any messages for the tester will display here." );
       
   163     }
       
   164 
       
   165     public static void createDialog( )
       
   166     {
       
   167         dialog = new TestDialog( new Frame(), "Instructions" );
       
   168         String[] defInstr = { "Instructions will appear here. ", "" } ;
       
   169         dialog.printInstructions( defInstr );
       
   170         dialog.show();
       
   171         println( "Any messages for the tester will display here." );
       
   172     }
       
   173 
       
   174 
       
   175     public static void printInstructions( String[] instructions )
       
   176     {
       
   177         dialog.printInstructions( instructions );
       
   178     }
       
   179 
       
   180 
       
   181     public static void println( String messageIn )
       
   182     {
       
   183         dialog.displayMessage( messageIn );
       
   184     }
       
   185 
       
   186 }// Sysout  class
       
   187 
       
   188 /**
       
   189   This is part of the standard test machinery.  It provides a place for the
       
   190    test instructions to be displayed, and a place for interactive messages
       
   191    to the user to be displayed.
       
   192   To have the test instructions displayed, see Sysout.
       
   193   To have a message to the user be displayed, see Sysout.
       
   194   Do not call anything in this dialog directly.
       
   195   */
       
   196 class TestDialog extends Dialog
       
   197 {
       
   198 
       
   199     TextArea instructionsText;
       
   200     TextArea messageText;
       
   201     int maxStringLength = 80;
       
   202 
       
   203     //DO NOT call this directly, go through Sysout
       
   204     public TestDialog( Frame frame, String name )
       
   205     {
       
   206         super( frame, name );
       
   207         int scrollBoth = TextArea.SCROLLBARS_BOTH;
       
   208         instructionsText = new TextArea( "", 15, maxStringLength, scrollBoth );
       
   209         add( "North", instructionsText );
       
   210 
       
   211         messageText = new TextArea( "", 5, maxStringLength, scrollBoth );
       
   212         add("South", messageText);
       
   213 
       
   214         pack();
       
   215 
       
   216         show();
       
   217     }// TestDialog()
       
   218 
       
   219     //DO NOT call this directly, go through Sysout
       
   220     public void printInstructions( String[] instructions )
       
   221     {
       
   222         //Clear out any current instructions
       
   223         instructionsText.setText( "" );
       
   224 
       
   225         //Go down array of instruction strings
       
   226 
       
   227         String printStr, remainingStr;
       
   228         for( int i=0; i < instructions.length; i++ )
       
   229         {
       
   230             //chop up each into pieces maxSringLength long
       
   231             remainingStr = instructions[ i ];
       
   232             while( remainingStr.length() > 0 )
       
   233             {
       
   234                 //if longer than max then chop off first max chars to print
       
   235                 if( remainingStr.length() >= maxStringLength )
       
   236                 {
       
   237                     //Try to chop on a word boundary
       
   238                    int posOfSpace = remainingStr.
       
   239                    lastIndexOf( ' ', maxStringLength - 1 );
       
   240 
       
   241                    if( posOfSpace <= 0 ) {
       
   242                        posOfSpace = maxStringLength - 1;
       
   243                    }
       
   244 
       
   245                    printStr = remainingStr.substring( 0, posOfSpace + 1 );
       
   246                    remainingStr = remainingStr.substring( posOfSpace + 1 );
       
   247                 }
       
   248                 else //else just print
       
   249                 {
       
   250                     printStr = remainingStr;
       
   251                     remainingStr = "";
       
   252                 }
       
   253 
       
   254                 instructionsText.append( printStr + "\n" );
       
   255 
       
   256             }// while
       
   257 
       
   258         }// for
       
   259 
       
   260     }//printInstructions()
       
   261 
       
   262     //DO NOT call this directly, go through Sysout
       
   263     public void displayMessage( String messageIn )
       
   264     {
       
   265         messageText.append( messageIn + "\n" );
       
   266     }
       
   267 
       
   268 }// TestDialog  class