/*
* Copyright (c) 1998, 2023, Oracle and/or its affiliates. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* - Neither the name of Oracle nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
import java.io.FileWriter;
import java.io.PrintWriter;
import java.util.Date;
import java.awt.Toolkit;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JFrame;
import javax.swing.RepaintManager;
import javax.swing.UIManager;
/**
* This class runs the SwingMark benchmarks as an application
* Simply invoke this class' main() to run the test suite.
* Optionally you can use the name of a subclass of LookAndFeel
* as an arguement to main(). This will use that L&F for the test.
*/
public class SwingMark {
static SwingMarkPanel mainPanel;
static Date startTime;
static Date startupCompleteTime;
static Date endTime;
static int numRepeats = 1;
static boolean autoQuit = false;
static boolean sleepBetweenRuns = false;
static boolean useBlitScrolling = false;
static long[][] timeReport;
static long[][] memoryReport;
static String reportFileName = null;
static String memoryReportFileName = null;
@SuppressWarnings("deprecation")
public static void initFrame(JFrame frame) {
mainPanel = new SwingMarkPanel();
prepReports();
frame.getContentPane().add(mainPanel);
frame.pack();
frame.show();
}
protected static void prepReports() {
if (timeReport == null) {
timeReport = new long[numRepeats][mainPanel.tests.length];
}
if (memoryReport == null) {
memoryReport = new long[numRepeats][2];
}
}
public static void main(String[] args) {
System.out.println("Starting SwingMark");
startTime = new Date();
System.out.println("SwingMark Test started at " + startTime);
parseArgs(args);
JFrame f = new JFrame("SwingMarks");
Thread.currentThread().setPriority(Thread.NORM_PRIORITY-1);
f.addWindowListener( new Closer() );
initFrame(f);
Date startupCompleteTime = new Date();
long elapsedTime = startupCompleteTime.getTime() - startTime.getTime();
System.out.println("Startup Time: "+elapsedTime);
//int repeat = 15;
for (int i = 0; i < numRepeats; i++) {
mainPanel.runTests(i);
if (i < numRepeats - 1) {
f.setVisible(false);
f.dispose();
AbstractSwingTest.rest();
f = new JFrame("SwingMarks " + (i+2));
initFrame(f);
f.addWindowListener( new Closer() );
System.out.println(" **** Starting run " + (i+2) + "****");
maybeSleep();
}
}
Date endTime = new Date();
elapsedTime = endTime.getTime() - startTime.getTime();
System.out.println("Score: "+elapsedTime);
writeReport();
writeMemoryReport();
if (autoQuit) {
System.exit(0);
}
}
static void maybeSleep() {
if (sleepBetweenRuns) {
for (int i = 0; i < 10; i++) {
Toolkit.getDefaultToolkit().beep();
try {
AbstractSwingTest.syncRam();
Thread.sleep(900);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
static class Closer extends WindowAdapter {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
}
@SuppressWarnings("deprecation")
private static void parseArgs(String[] args) {
String lafName = UIManager.getCrossPlatformLookAndFeelClassName();
int lfOpts = 0;
int nOpts = 0;
for (int i = 0; i < args.length; i++) {
if (args[i].indexOf("-lf") == 0) {
lafName = args[i+1];//.substring(3);
lfOpts = 1;
i++;
} else if (args[i].indexOf("-n") == 0) {
// use native look and feel
lafName = UIManager.getSystemLookAndFeelClassName();
nOpts++;
} else if (args[i].indexOf("-r") == 0) {
String repeatString = args[i+1];//.substring(2);
numRepeats = Integer.parseInt(repeatString);
System.out.println("Will run test " + numRepeats + " times in the same VM");
i++;
} else if (args[i].equals("-q")) {
autoQuit = true;
System.out.println("Program will automatically terminate after last run");
} else if (args[i].equals("-f")) {
reportFileName = args[i+1];
if (reportFileName.indexOf("-mmdd") != -1) {
Date date = new Date();
int startpos = reportFileName.indexOf("-mmdd");
reportFileName =
reportFileName.substring(0,startpos)+(date.getMonth()+1)+"-"+
date.getDate()+reportFileName.substring(startpos+5);
}
i++;
System.out.println("Will write test report to file: "+ reportFileName);
} else if (args[i].equals("-m")) {
memoryReportFileName = args[i+1];
i++;
System.out.println("Will write memory report to file: "+ memoryReportFileName);
} else if (args[i].equals("-db=off")) {
RepaintManager.currentManager(null).setDoubleBufferingEnabled(false);
System.out.println("Will run without double buffering");
} else if (args[i].equals("-sleep")) {
sleepBetweenRuns = true;
System.out.println("Will sleep for 5 seconds between runs");
} else if (args[i].equals("-blit")) {
useBlitScrolling = true;
System.out.println("Will use fast window blitting");
} else if (args[i].equals("-version")) {
System.out.println("SwingMark build Oct 28, 2005");
} else {
System.out.println("Unexpected Argument: " + args[i]);
System.exit(1);
}
}
if (lfOpts + nOpts > 1) {
System.out.println("-lf and -n are mutually exclusive\n");
System.exit(1);
}
switchLookAndFeel(lafName);
}
private static void switchLookAndFeel(String lafName) {
try {
System.out.println("Setting L&F to: "+ lafName);
UIManager.setLookAndFeel(lafName);
} catch (Exception e) {
System.out.println(e);
System.exit(1);
}
}
protected static void writeReportHeader(PrintWriter writer) {
writer.println("");
writer.println("SwingMark");
writer.println();
writer.println("" + startTime + "");
writer.println("" + System.getProperty("java.version") + "");
writer.println("" + System.getProperty("java.vendor") + "");
writer.println("" + System.getProperty("java.home") + "");
String vmName = System.getProperty("java.vm.name");
String vmVersion = System.getProperty("java.vm.info");
String vmString = "Undefined";
if (vmName != null && vmVersion != null) {
vmString = vmName + " " + vmVersion;
}
writer.println("" + vmString + "");
writer.print("" + System.getProperty("os.name") );
writer.println(" version " + System.getProperty("os.version")+ "");
int bits = java.awt.Toolkit.getDefaultToolkit().getColorModel().getPixelSize();
writer.println("" + bits + "");
writer.println();
}
protected static void writeReportFooter(PrintWriter writer) {
writer.println("");
}
protected static void writeReport() {
if (reportFileName != null) {
try {
System.out.println("Writing report to file: "+ reportFileName);
FileWriter fileWriter = new FileWriter(reportFileName);
PrintWriter writer = new PrintWriter(fileWriter);
writeReportHeader(writer);
writer.println("");
for (int testNumber =0; testNumber < mainPanel.tests.length; testNumber++) {
writer.print(mainPanel.tests[testNumber].getTestName() + "\t");
for (int runNumber = 0; runNumber < numRepeats; runNumber++) {
writer.print(timeReport[runNumber][testNumber]);
if (runNumber < numRepeats -1) {
writer.print("\t");
}
}
writer.println();
}
writer.println("");
writer.println();
writeReportFooter(writer);
writer.close();
fileWriter.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
protected static void writeMemoryReport() {
if (memoryReportFileName != null) {
try {
System.out.println("Writing memory report to file: "+ memoryReportFileName);
FileWriter fileWriter = new FileWriter(memoryReportFileName);
PrintWriter writer = new PrintWriter(fileWriter);
writeReportHeader(writer);
writer.println("Used Memory\tHeapSize");
for (int runNumber = 0; runNumber < numRepeats; runNumber++) {
writer.print(memoryReport[runNumber][0]);
writer.print("\t");
writer.println(memoryReport[runNumber][1]);
}
writer.println();
writeReportFooter(writer);
writer.close();
fileWriter.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}