0

由于 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/sec 为单位计算吞吐量,例如,

double throughput=1/timeTaken;

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

4

2 回答 2

2

我想知道这种方法是否适用于进行深层复制。

它会工作1。但是,这并不是实现深度复制的最有效方式。(手动实现深度复制可能要快一个数量级。)

变量 timeTaken 会给我做深拷贝的实际时间吗?

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

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

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

正如评论所建议的那样,最好使用System.arraycopy. 更好的是,使用“更接近金属”的语言进行基准测试;例如在 C 或汇编语言中。


1 - 我假设您正在复制的对象图是完全可序列化的。

于 2013-01-30T06:58:09.033 回答
1

简单的答案是:不,这不是正确的方法。不知道你想要完成什么,很难知道正确的方法应该是什么,但如果你真的想写一个复制内存的微基准(!)那么你必须首先阅读这个:我如何写一个Java中的正确微基准?

于 2013-01-30T06:59:49.703 回答