由于System.arraycopy()和clone()只进行浅层复制,我想知道这种方法是否适合进行深层复制。
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
long x=System.nanoTime();
oos.writeObject(fromArray);
oos.flush();
ByteArrayInputStream bin = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bin);
Object o=ois.readObject();
double timeTaken= (System.nanoTime()-x)/1000000000.0;
1)变量timeTaken会给我一个深度复制的实际时间吗?
2)如果我传递数据,请说一个大小为1MB的数组,如
byte[] fromArray = new byte[1024*1024];
并以Mb /秒为单位计算吞吐量,
double throughput=1/timeTaken;
将此视为内存基准测试吞吐量是否合理?
答案 0 :(得分:2)
我想知道这种方法是否可以用于深层复制。
它将起作用 1 。然而,它不是实现深度复制的最有效方式。 (手动实施深度复制可能要快一个数量级。)
变量timeTaken会给我一个深度复制的实际时间吗?
这取决于。如果JVM已经适当地预热,那么这应该给出准确的测量。但它是衡量这种做深度复制的方法......而不是一般意义上的深层复制。 (见上文......)
将此视为内存基准测试吞吐量是否合理?
没有。对象序列化和反序列化所涉及的工作远非异构,被认为是内存系统性能的有效代理。
正如评论建议的那样,最好使用System.arraycopy
将数据从一个数组批量复制到另一个数组。更好的是,用“更接近金属”的语言进行基准测试;例如用C或汇编语言。
1 - 我假设你要复制的对象图是完全可序列化的。
答案 1 :(得分:1)
简单的答案是:不,这不是正确的做法。不知道你想要完成什么,很难知道正确的方法应该是什么,但如果你真的想要要写一个用于复制内存的微基准(!),那么你必须首先阅读:How do I write a correct micro-benchmark in Java?