0

此代码应在文件夹中查找图像,并将图像组合成 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();
    }
4

3 回答 3

2

延迟可能在文件系统中,打开所有这些文件。在一个目录中有这么多文件,即使只是目录中的查找时间也很重要。

如果是这种情况,就不会有软件解决方案。尝试将文件放在闪存驱动器上,看看是否有帮助,即使只是作为测试。

于 2012-05-18T22:25:23.253 回答
1

大小为 6032*6032 的图像和 2 个嵌套循环,每个大小为 376 绘制近 3600 万像素至少 2 次并循环 141000 次

不要忘记阅读文件...

我建议您尝试使用 2 个线程组合成对的图像

于 2012-05-19T00:13:50.683 回答
0

我不知道您的应用程序,但您可以保存新创建的图像并在生成新图像之前检查它是否是最新的。或者,保存更多信息并仅更新更改的部分。

但是,如果每次加载程序时一切都发生了变化,那么瓶颈显然是 I/O 延迟。没有钱购买 SSD 或 raidsystem,您将无法通过它;)

于 2012-05-18T23:28:04.283 回答