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

这是在java中进行深度复制以进行内存基准测试的正确方法吗?,java,memory,benchmarking,deep-copy,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(); ByteArrayInputStre

由于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) 变量timetake是否会给我进行深度复制的实际时间

2) 如果我传递数据,比如说一个大小为1MB的数组

byte[] fromArray = new byte[1024*1024];
并以Mb/秒为单位计算吞吐量

double throughput=1/timeTaken;
<> P>是否将其视为内存基准吞吐量? 我想知道这种方法是否适用于深度复制

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;
它会起作用的。但这并不是实现深度复制的最有效方法。(手动实现深度复制可能要快一个数量级。)

变量timetake是否会给我进行深度复制的实际时间

视情况而定。如果JVM已经被适当地预热,那么这应该给出一个准确的度量。但这是一个衡量这种方式做深拷贝。。。不是一般意义上的深度复制。(见上文……)

<> P>是否将其视为内存基准吞吐量? 不需要。对象序列化和反序列化所涉及的工作远不是异构的,因此被认为是内存系统性能的有效代理

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


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

我想知道这种方法是否适用于深度复制

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;
它会起作用的。但这并不是实现深度复制的最有效方法。(手动实现深度复制可能要快一个数量级。)

变量timetake是否会给我进行深度复制的实际时间

视情况而定。如果JVM已经被适当地预热,那么这应该给出一个准确的度量。但这是一个衡量这种方式做深拷贝。。。不是一般意义上的深度复制。(见上文……)

<> P>是否将其视为内存基准吞吐量? 不需要。对象序列化和反序列化所涉及的工作远不是异构的,因此被认为是内存系统性能的有效代理

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



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

简单的答案是:不,这不是正确的方法。如果不知道您要完成什么,很难知道正确的方法应该是什么,但是如果您真的想为复制内存编写一个微基准(!)然后您必须首先阅读以下内容:

简单的答案是:不,这不是正确的方法。如果不知道您要完成什么,很难知道正确的方法应该是什么,但是如果您真的想编写一个复制内存的微基准(!)然后您必须首先阅读以下内容:

深度复制的一个有趣尝试。当然,这种技术会受到序列化的所有限制。你看过类似这样的框架吗?你到底想做什么基准测试?JVM能够以多快的速度遍历对象图,或者它能够以多快的速度从连续的内存块中读取数据?这两者可能有很大的不同。我正在尝试测试我读写一大块数据(1B、1Kb和1Mb)到内存的速度。你希望在序列化背后有一些神奇的memcopy吗?你为什么不直接读/写存储器arr[i]=j;arr[i]==j@Prasanna:读写RAM所需的时间完全取决于缓存效果和引用的位置,因此您的基准不太可能给您带来有意义的结果。很明显,你担心某件事太慢了。如果你解释了你的用例,你将更有可能得到有用的答案。深度复制的一个有趣尝试。当然,这种技术会受到序列化的所有限制。你看过类似这样的框架吗?你到底想做什么基准测试?JVM能够以多快的速度遍历对象图,或者它能够以多快的速度从连续的内存块中读取数据?这两者可能有很大的不同。我正在尝试测试我读写一大块数据(1B、1Kb和1Mb)到内存的速度。你希望在序列化背后有一些神奇的memcopy吗?你为什么不直接读/写存储器arr[i]=j;arr[i]==j@Prasanna:读写RAM所需的时间完全取决于缓存效果和引用的位置,因此您的基准不太可能给您带来有意义的结果。很明显,你担心某件事太慢了。如果您解释了您的用例,您将更有可能得到有用的答案。通过序列化进行深度克隆并非在所有情况下都有效。尤其是当对象图的成员类不可序列化时(或者由于临时字段的原因,仅部分可序列化)。该技术还容易受到
writeObject
readObject
、又称自定义序列化的错误实现的影响。通过序列化进行深度克隆并非在所有情况下都有效。尤其是当对象图的成员类不可序列化时(或者由于临时字段的原因,仅部分可序列化)。该技术还容易受到
writeObject
readObject
、又称自定义序列化的错误实现的攻击。