在分析应用程序时,我注意到RandomAccessFile.writeLong花了很多时间。为什么RandomAccessFile writeLong实现多个写入调用?
我检查了这个方法的代码,它涉及8个本地方法写入的调用。 我使用byte []编写了writeLong的替代实现。事情是这样的:
RandomAccessFile randomAccessFile = new RandomAccessFile("out.dat", "rwd");
...
byte[] aux = new byte[8];
aux[0] = (byte) ((l >>> 56) & 0xFF);
aux[1] = (byte) ((l >>> 48) & 0xFF);
aux[2] = (byte) ((l >>> 40) & 0xFF);
aux[3] = (byte) ((l >>> 32) & 0xFF);
aux[4] = (byte) ((l >>> 24) & 0xFF);
aux[5] = (byte) ((l >>> 16) & 0xFF);
aux[6] = (byte) ((l >>> 8) & 0xFF);
aux[7] = (byte) ((l >>> 0) & 0xFF);
randomAccessFile.write(aux);
我做了一个小的基准,并得到这些结果:
使用writeLong():
用于调用的平均时间:91毫秒使用写入(字节[ ]):
平均调用时间:11 ms
在具有Intel(R)CPU T2300 @ 1.66GHz的Linux机器上进行测试运行
由于本地调用会有一些性能损失,为什么writeLong以这种方式实现? 我知道这个问题应该提交给太阳队员,但是我希望这里有人提供一些提示。
谢谢。
是的,这是毫秒。 – jassuncao 2011-04-21 10:25:31
它们应该快得多。你可以试试我的测试代码是微秒吗? – 2011-04-21 10:27:11
在我的测试中,我也使用'd'标志。这使写入同步,使写入慢很多。 – jassuncao 2011-04-21 10:42:29