我目前正在将用于随机二进制文件访问的Delphi方法转换为Java。Delphi过程使用:
TSingleArray = Array[0..MAXSIZE] of Single
...
procedure GetLinkValues(const LinkVar: Integer; const TimePeriod: Integer; var Value: PSingleArray);
...
BlockRead(Fout, Value^, Nlinks*SizeOf(Single));
将字节数组读入单个字节数组。在Java中,有没有一种不需要迭代数组就能做到这一点的等效方法?
我目前使用的是
List<Float> l = new ArrayList<Float>();
…
for (int i = 0 ; i < nLinks ; i++ )
l.add( resultsFile.readFloat());
但我关心的是速度。字节顺序不是问题。
发布于 2009-02-20 08:57:11
你是否对代码进行了概要分析,并发现它确实存在问题?一些东西将不得不循环...你确定这是你代码中的瓶颈吗?
话虽如此,您应该能够使用FloatBuffer,我怀疑它可以做您想做的事情。不幸的是,Sun的JavaDoc已经关闭了,所以我现在不能很容易地链接到或者查看文档。
要使用FloatBuffer,您可能需要:
创建与文件相关联的FileChannel (例如,使用FileInputStream.getChannel)
我对java.nio不是特别熟悉,所以我希望这一切都是正确的--但这可能是相当麻烦的。您当前的循环几乎肯定是更简单的,所以我强烈建议您先检查一下它的性能!顺便说一下,您可能希望将当前的FileInputStream包装在BufferedInputStream中。
发布于 2009-02-23 03:42:09
基于Jon提供的帮助,最终代码如下所示:
byte[] bt = new byte[nLinks * 4];
List<Float> l = new ArrayList<Float>();
if (linkVar != 0 && timePeriod < nPeriods) {
long p1 = RECORDSIZE * (nNodes * NODEVARS + nLinks * LINKVARS);
long p2 = RECORDSIZE * (nNodes * NODEVARS + nLinks * (linkVar - 1));
long p3 = offset2 + (timePeriod * p1) + p2;
resultsFile.seek(p3);
resultsFile.read(bt, 0, nLinks * 4);
ByteBuffer bb = ByteBuffer.wrap(bt);
bb.rewind();
bb.asFloatBuffer().get(values);
}
发布于 2011-01-11 16:29:10
无论是你自己的循环,还是在缓冲区复制方法/操作内部的循环,总会有一个循环。除此之外,加速的唯一方法是找到支持向量运算的硬件和编译器。
https://stackoverflow.com/questions/570338
复制相似问题