在分析应用程序时,我注意到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);
我做了一个小基准测试并得到了这些结果:
Using writeLong():
Average time for invocation: 91 msUsing write(byte[]):
Average time for invocation: 11 ms
在具有Intel(R)cpu T2300 @ 1.66GHz的Linux机器上进行测试
由于本机调用会有一些性能损失,为什么writeLong会以这种方式实现?
我知道应该向太阳队员提出这个问题,但我希望这里的人有一些提示.
谢谢.
最佳答案
原文链接:https://www.f2er.com/java/437829.html