这是在java中对内存进行基准测试的深层复制的正确方法吗?

时间:2013-01-30 05:42:41

标签: java memory benchmarking deep-copy

由于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;

将此视为内存基准测试吞吐量是否合理?

2 个答案:

答案 0 :(得分:2)

  

我想知道这种方法是否可以用于深层复制。

它将起作用 1 。然而,它不是实现深度复制的最有效方式。 (手动实施深度复制可能要快一个数量级。)

  

变量timeTaken会给我一个深度复制的实际时间吗?

这取决于。如果JVM已经适当地预热,那么这应该给出准确的测量。但它是衡量这种做深度复制的方法......而不是一般意义上的深层复制。 (见上文......)

  

将此视为内存基准测试吞吐量是否合理?

没有。对象序列化和反序列化所涉及的工作远非异构,被认为是内存系统性能的有效代理。

正如评论建议的那样,最好使用System.arraycopy将数据从一个数组批量复制到另一个数组。更好的是,用“更接近金属”的语言进行基准测试;例如用C或汇编语言。


1 - 我假设你要复制的对象图是完全可序列化的。

答案 1 :(得分:1)

简单的答案是:不,这不是正确的做法。不知道你想要完成什么,很难知道正确的方法应该是什么,但如果你真的想要要写一个用于复制内存的微基准(!),那么你必须首先阅读:How do I write a correct micro-benchmark in Java?