记录PC端处理图片颜色翻转的java、JNA、JNI处理耗时情况
默认情况下未指定编译优化参数,处理器i7-4360.
图片选用尽量大的一张4K图片。
实验结果 *java :23 JNA :302 JNI :206
差异很大,估计java编译器根据循环长度启动了JIT,可能也优化拆分了for循环
java :26
c :640
c :239
//24,309,175ms
public static void main(String[] args) {
String path = "C:\\Users\\Administrator\\Pictures\\est\\4k.jpg";
try {
BufferedImage img = ImageIO.read(new File(path));
Raster r = img.getData();
System.out.println(r.getWidth() + "," + r.getHeight());
int w = r.getWidth(), h = r.getHeight();
int[] data = new int[w * h];
img.getRGB(0, 0, w, h, data, 0, w);
long s = System.currentTimeMillis();
rsv(data);
long e = System.currentTimeMillis();
System.out.println("java :" + (e - s));
BufferedImage bf = new BufferedImage(w, h, BufferedImage.TYPE_INT_BGR);
bf.setRGB(0, 0, w, h, data, 0, w);
OutputStream output = new FileOutputStream(path.substring(0, path.lastIndexOf(".")) + "_2.jpg");
ImageIO.write(bf, "jpg", output);
// System.setProperty("jna.debug_load", "true");
s = System.currentTimeMillis();
ImgRsv.instance.nrsv(data, data.length);
e = System.currentTimeMillis();
System.out.println("c :" + (e - s));
bf.setRGB(0, 0, w, h, data, 0, w);
output = new FileOutputStream(path.substring(0, path.lastIndexOf(".")) + "_jna.jpg");
ImageIO.write(bf, "jpg", output);
s = System.currentTimeMillis();
TJNI.rsv(data);
e = System.currentTimeMillis();
System.out.println("c :" + (e - s));
bf.setRGB(0, 0, w, h, data, 0, w);
output = new FileOutputStream(path.substring(0, path.lastIndexOf(".")) + "_jni.jpg");
ImageIO.write(bf, "jpg", output);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void rsv(int[] data) {
for (int i = 0; i < data.length; i++) {
int r = 255 - (data[i] >> 16 & 0xff);
int g = 255 - (data[i] >> 8 & 0xff);
int b = 255 - (data[i] & 0xff);
data[i] = r << 16 | g << 8 | b;
}
}
public interface ImgRsv extends Library{
ImgRsv instance=(ImgRsv) Native.loadLibrary("src/img/t1/tc.dll",ImgRsv.class);
void nrsv(int[] data,int len);
}