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/秒で計算します。

double throughput=1/timeTaken;

これをメモリベンチマークスループットと見なすのは合理的でしょうか?

4

2 に答える 2

2

このアプローチがディープコピーを行うのに役立つのだろうか。

1で動作します。ただし、これはディープコピーを実装するための最も効率的な方法ではありません。(手作業でディープコピーを実装する方が、おそらく1桁速くなります。)

変数timeTakenは、ディープコピーを実行する実際の時間を教えてくれますか?

場合によります。JVMが適切にウォームアップされている場合、これにより正確な測定値が得られるはずです。しかし、それはディープコピーを行うこの方法の尺度です...一般的な意味でのディープコピーではありません。(そして上記を参照してください...)

これをメモリベンチマークスループットと見なすのは合理的でしょうか?

いいえ。オブジェクトのシリアル化と逆シリアル化に関連する作業は、メモリシステムのパフォーマンスの有効なプロキシと見なされるには、異質なものではありません。

コメントが示唆しているように、を使用して1つの配列から別の配列にデータを一括コピーする方がよいでしょうSystem.arraycopy。さらに良いことに、「金属に近い」言語でベンチマークを実行します。たとえば、Cまたはアセンブリ言語で。


1-コピーしているオブジェクトグラフは完全にシリアル化可能であると想定しています。

于 2013-01-30T06:58:09.033 に答える
1

簡単な答えは次のとおりです。いいえ、これは正しいアプローチではありません。あなたが何を達成しようとしているのかを知らなければ、正しいアプローチがどうあるべきかを知るのは難しいですが、メモリをコピーするためのマイクロベンチマークを本当に書きたいのであれば(!)、最初にこれを読む必要があります: Javaの正しいマイクロベンチマーク?

于 2013-01-30T06:59:49.703 に答える