此代码应查找文件夹中的图像,并将图像合并为6000x6000图像。它工作正常,但它确实很慢。我可以实现的任何优化吗?
File in = new File(args[1]);
File out = new File(args[2]);
in.mkdirs();
out.mkdirs();
if(out.exists())
{
out.delete();
}
if(!in.isDirectory())
{
Main.printUsage();
}
BufferedImage bout = new BufferedImage(6032, 6032, BufferedImage.TYPE_INT_ARGB);
Graphics2D g = bout.createGraphics();
int count = 0;
long starttime = System.currentTimeMillis();
for(int i=0; i<=376; i++)
{
for(int k=0; k<=376; k++)
{
File cu = new File(in, (i-188)+"-"+(k-188)+".png");
if(cu.exists())
{
count++;
try {
g.drawImage(ImageIO.read(cu), 16*i, 16*k, null);
} catch (IOException e) {
e.printStackTrace();
}
Runtime.getRuntime().;
}
}
}
System.out.println("Processed "+count+" chunks in "+((System.currentTimeMillis()-starttime)/1000F)+" seconds");
g.dispose();
try {
ImageIO.write(bout, "png", out);
} catch (IOException e) {
e.printStackTrace();
}
答案 0 :(得分:2)
延迟可能在文件系统中,打开所有这些文件。将这么多文件放在一个目录中,即使只是目录中的查找时间也是非常重要的。
如果是这种情况,则不会有软件解决方案。尝试将文件放在闪存驱动器上以查看是否有帮助,即使只是作为测试。
答案 1 :(得分:1)
大小为6032 * 6032的图像和2个嵌套循环,每个大小为376 至少2次绘制近3600万像素 循环141次
不要忘记阅读文件......
我建议您尝试使用2个线程组合图像对
答案 2 :(得分:0)
我不知道您的应用程序,但您可以保存新创建的图像,并在生成新图像之前检查它是否是最新的。或者,保存更多信息并仅更新已更改的部分。
但是如果每次加载程序时一切都改变了,那么瓶颈显然是I / O延迟。如果没有SSD或raidsystem的钱,你就不会通过它;)