如何提高这段代码的性能

时间:2014-07-31 12:49:43

标签: java performance io random-access

如何使这段代码非常快? 它使用RandomAccessFile(in)读取原始图像,并使用DataOutputStream(out)将其写入文件

final int WORD_SIZE = 4;
byte[] singleValue = new byte[WORD_SIZE];
long position;

    for (int i=1; i<=100000; i++)
    {
             out.writeBytes(i + " ");

             for(int j=1; j<=17; j++)
             {
                  in.seek(position);
                  in.read(singleValue);                     
                  String str = Integer.toString(ByteBuffer.wrap(singleValue).order(ByteOrder.LITTLE_ENDIAN).getInt());
                  out.writeBytes(str + " ");
                  position+=WORD_SIZE;      
             }
             out.writeBytes("\n");
    }

内部for每17个元素

在文件中创建一个新行

由于

1 个答案:

答案 0 :(得分:1)

我认为你问的原因是因为这段代码运行得非常慢。如果是这种情况,那么一个原因是每个seekread调用正在进行系统调用。 RandomAccessFile没有缓冲。 (我猜测singleValue是长度为1的byte[]。)

因此,提高速度的方法是退后一步,思考它实际上在做什么。如果我理解正确的话,那就是读取文件中的每个第4个字节,将它们转换为十进制数并将它们作为文本输出,17输出到一行。您可以使用BufferedInputStream这样轻松地执行此操作:

    int b = bis.read();  // read a byte
    bis.skip(3);         // skip 3 bytes.

(有一点错误检查......)。如果您使用这样的BufferedInputStream,则大多数readskip调用将对已经缓冲的数据进行操作,并且每N个字节的系统调用数将减少为1 ,其中N是缓冲区大小。

更新 - 我的猜测错了。你实际上正在阅读替代词,所以......

    bis.read(singleValue);
    bis.skip(4);

  

每100000个偏移我必须跳到200000,然后再重复一次,直到文件结束。

使用bis.skip(800000)来做到这一点。它应该通过移动文件位置而不实际读取任何数据来进行大跳跃。一个系统调用最多。 (对于FileInputStream,至少。)


通过将DataOutputStream包裹在BufferedOutputStream附近,您还可以将输出端加速大致相等的数量。

但是System.out已经缓存了。