/**
* Project: simpleimage-1.1 File Created at 2010-8-24 $Id$ Copyright 2008 Alibaba.com Croporation Limited. All rights
* reserved. This software is the confidential and proprietary information of Alibaba Company.
* ("Confidential Information"). You shall not disclose such Confidential Information and shall use it only in
* accordance with the terms of the license agreement you entered into with Alibaba.com.
*/
package com.alibaba.simpleimage.codec.jpeg;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Iterator;
import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
import junit.framework.TestCase;
import org.apache.commons.io.IOUtils;
import com.alibaba.simpleimage.ImageWrapper;
import com.alibaba.simpleimage.io.ByteArrayOutputStream;
import com.alibaba.simpleimage.io.ImageInputStream;
import com.alibaba.simpleimage.io.ImageBitsInputStream;
/**
* TODO Comment of JPEGDecodePerformanceTest
*
* @author wendell
*/
public class JPEGDecodePerformanceTest extends TestCase {
static File imgDir = new File("./src/test/resources/conf.test/simpleimage/codec/jpeg/performance");
static int TIMES = 500;
static int FREQUENCY = 2;
static String name = "small.jpg";
public void testNull() {
}
protected void run(DecodeFacade decoder, File rootDir, String filename, int times, int frequency) throws Exception {
long start, end, total = 0L;
if (rootDir == null) {
rootDir = imgDir;
}
FileInputStream inputStream = new FileInputStream(new File(rootDir, filename));
ByteArrayOutputStream temp = new ByteArrayOutputStream();
IOUtils.copy(inputStream, temp);
IOUtils.closeQuietly(inputStream);
InputStream img = temp.toInputStream();
temp = null;
System.out.println("***********Performance Test**************");
for (int i = 0; i < frequency; i++) {
// System.gc();
// Thread.sleep(5 * 1000L);
start = System.currentTimeMillis();
for (int t = 0; t < times; t++) {
// File img = imgs[t % imgs.length];
img.reset();
BufferedImage bi = decoder.decode(img);
bi.getHeight();
bi = null;
}
end = System.currentTimeMillis();
total += (end - start);
}
System.out.printf("Decoder : %s \n", decoder.getName());
System.out.println("Image : " + filename);
System.out.printf("Times : %d\n", times);
System.out.printf("Frequency : %d\n", frequency);
System.out.printf("Total time : %d ms\n", total);
System.out.printf("Average time : %.2f ms\n", ((double) total / (times * frequency)));
}
interface DecodeFacade {
public BufferedImage decode(InputStream img) throws IOException;
public String getName();
}
protected DecodeFacade getAliDecoder() {
DecodeFacade d = new DecodeFacade() {
public BufferedImage decode(InputStream in) throws IOException {
// FileInputStream in = null;
ImageInputStream imageStream = null;
try {
// in = new FileInputStream(img);
imageStream = new ImageBitsInputStream(in);
JPEGDecoder decoder = new JPEGDecoder(imageStream);
ImageWrapper wi = decoder.decode();
return wi.getAsBufferedImage();
} finally {
// IOUtils.closeQuietly(in);
if (imageStream != null) {
imageStream.close();
}
}
}
public String getName() {
return "Ali Decoder";
}
};
return d;
}
protected DecodeFacade getJDKDecoder() {
DecodeFacade d = new DecodeFacade() {
public BufferedImage decode(InputStream img) throws IOException {
javax.imageio.stream.ImageInputStream stream = null;
try {
stream = ImageIO.createImageInputStream(img);
Iterator<ImageReader> readers = ImageIO.getImageReaders(stream);
ImageReader reader = null;
while (readers.hasNext()) {
reader = readers.next();
if (reader.canReadRaster()) {
break;
}
}
reader.setInput(stream);
BufferedImage bi = reader.read(0);
return bi;
} finally {
if (stream != null) {
stream.close();
}
}
}
public String getName() {
return "JDK Decoder";
}
};
return d;
}
public static void main(String[] args) throws Exception {
String filename = "big.jpg";
int times = TIMES;
int frequency = FREQUENCY;
String decoder = "Ali";
String imgDirStr = "/src/test/resources/conf.test/simpleimage/codec/jpeg/performance";
File imgDir = null;
if (args.length > 0) {
imgDir = new File(args[0].trim() + imgDirStr);
}
if (args.length > 1) {
filename = args[1].trim();
}
if (args.length > 2) {
times = Integer.parseInt(args[2]);
}
if (args.length > 3) {
frequency = Integer.parseInt(args[3]);
}
if (args.length > 4) {
decoder = args[4].trim();
}
JPEGDecodePerformanceTest testInstance = new JPEGDecodePerformanceTest();
if ("JDK".equalsIgnoreCase(decoder)) {
testInstance.run(testInstance.getJDKDecoder(), imgDir, filename, times, frequency);
} else {
testInstance.run(testInstance.getAliDecoder(), imgDir, filename, times, frequency);
}
}
}