// ImageViewerPerfTest.java // ----------------------- // part of YaCy // Copyright 2016 by luccioman; https://github.com/luccioman // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA import java.io.File; import java.io.FileOutputStream; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.TreeMap; import javax.imageio.ImageIO; import javax.imageio.stream.ImageInputStream; import net.yacy.cora.document.id.DigestURL; import net.yacy.cora.util.ConcurrentLog; import net.yacy.peers.graphics.EncodedImage; import net.yacy.server.serverObjects; /** * Test to measure image render performance by * * @author luc * */ public class ImageViewerPerfTest extends ImageViewerTest { /** Default minimum measurement time */ private static final int DEFAULT_MIN_MEASURE_TIME = 10; /** Minimum measurement time */ private int minMeasureTime; /** * @param args * main parameters : args[7] may contain minimum measurement time * in secondes. Default : 10. */ public ImageViewerPerfTest(String args[]) { this.minMeasureTime = getMinMeasurementTime(args); } /** * * @param args * main parameters : args[7] may contain minimum measurement time * in secondes. Default : 10. * @return extension to use for encoding */ protected int getMinMeasurementTime(String args[]) { int time; if (args != null && args.length > 7) { time = Integer.parseInt(args[7]); } else { time = DEFAULT_MIN_MEASURE_TIME; } return time; } /** * Process inFile image, update processedFiles list and failures map, and * append measurements to results_perfs.txt. All parameters must not be * null. * * @param ext * output encoding image format * @param outDir * output directory * @param post * post parameters * @param failures * map failed file urls to eventual exception * @param inFile * file image to process * @throws IOException * when an read/write error occured */ @Override protected void processFile(String ext, File outDir, serverObjects post, Map<String, Throwable> failures, File inFile) throws IOException { /* Delete eventual previous result file */ System.out .println("Measuring render with file : " + inFile.getAbsolutePath() + " encoded To : " + ext); File outFile = new File(outDir, inFile.getName() + "." + ext); if (outFile.exists()) { outFile.delete(); } String urlString = inFile.getAbsolutePath(); EncodedImage img = null; Exception error = null; long beginTime = System.nanoTime(), time, minTime = Long.MAX_VALUE, maxTime = 0, meanTime = 0, totalTime = 0; int step = 0; for (step = 0; (totalTime / 1000000000) < this.minMeasureTime; step++) { beginTime = System.nanoTime(); ImageInputStream inStream = ImageIO.createImageInputStream(inFile); try { img = this.VIEWER.parseAndScale(post, true, new DigestURL(urlString), ext, inStream); } catch (Exception e) { error = e; } time = System.nanoTime() - beginTime; minTime = Math.min(minTime, time); maxTime = Math.max(maxTime, time); totalTime += time; } if (step > 0) { meanTime = totalTime / step; } else { meanTime = totalTime; } PrintWriter resultsWriter = new PrintWriter(new FileWriter(new File(outDir, "results_perfs.txt"), true)); try { writeMessage("Measured render with file : " + inFile.getAbsolutePath() + " encoded To : " + ext, resultsWriter); if(img == null) { writeMessage("Image could not be rendered! Measurement show time needed to read and parse image data until error detection.", resultsWriter); } writeMessage("Render total time (ms) : " + (totalTime) / 1000000 + " on " + step + " steps.", resultsWriter); writeMessage("Render mean time (ms) : " + (meanTime) / 1000000, resultsWriter); writeMessage("Render min time (ms) : " + (minTime) / 1000000, resultsWriter); writeMessage("Render max time (ms) : " + (maxTime) / 1000000, resultsWriter); } finally { resultsWriter.close(); } if (img == null) { failures.put(urlString, error); } else { FileOutputStream outFileStream = null; try { outFileStream = new FileOutputStream(outFile); img.getImage().writeTo(outFileStream); } finally { if (outFileStream != null) { outFileStream.close(); } img.getImage().close(); } } } /** * Test image(s) (default : classpath resource folder /viewImageTest/test/) * are parsed and rendered again and again until specified time (default : * 10 seconds) elapsed. Then rendered image is written to outDir for visual * check and measured statistics are displayed. * * @param args * may be empty or contain parameters to override defaults : * <ul> * <li>args[0] : input image file URL or folder containing image * files URL. Default : classpath resource /viewImageTest/test/ * </li> * <li>args[1] : output format name (for example : "jpg") for * rendered image. Defaut : "png".</li> * <li>args[2] : ouput folder URL. Default : * "[system tmp dir]/Test".</li> * <li>args[3] : max width (in pixels) for rendered image. May be * set to zero to specify no max width. Default : no value.</li> * <li>args[4] : max height (in pixels) for rendered image. May * be set to zero to specify no max height. Default : no value. * </li> * <li>args[5] : set to "quadratic" to render square output * image. May be set to any string to specify no quadratic shape. * Default : false.</li> * <li>args[6] : set to "recursive" to process recursively sub * folders. Default : false.</li> * <li>args[7] : minimum measurement time in secondes. Default : * 10.</li> * </ul> * @throws IOException * when a read/write error occured */ public static void main(String args[]) throws IOException { ImageViewerPerfTest test = new ImageViewerPerfTest(args); File inFile = test.getInputURL(args); String ext = test.getEncodingExt(args); File outDir = test.getOuputDir(args); boolean recursive = test.isRecursive(args); serverObjects post = test.makePostParams(args); outDir.mkdirs(); File[] inFiles; if (inFile.isFile()) { inFiles = new File[1]; inFiles[0] = inFile; System.out.println( "Measuring render with file : " + inFile.getAbsolutePath() + " encoded To : " + ext); } else if (inFile.isDirectory()) { inFiles = inFile.listFiles(); System.out.println("Measuring render with files in folder : " + inFile.getAbsolutePath() + " encoded To : " + ext); } else { inFiles = new File[0]; } if (inFiles.length == 0) { throw new IllegalArgumentException(inFile.getAbsolutePath() + " is not a valid file or folder url."); } System.out.println("Rendered images will be written in dir : " + outDir.getAbsolutePath()); List<File> processedFiles = new ArrayList<File>(); Map<String, Throwable> failures = new TreeMap<>(); try { long time = System.nanoTime(); test.processFiles(ext, recursive, outDir, post, inFiles, processedFiles, failures); time = System.nanoTime() - time; test.displayResults(processedFiles, failures, time, outDir); } finally { ConcurrentLog.shutdown(); } } }