2013-01-30 1 views
0

Так как System.arraycopy() и clone() делают только мелкое копирование, интересно, будет ли этот подход работать для глубокой копии.Правильно ли это сделать глубокую копию в Java для бенчмаркинга?

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) Если я передаю данные говорят массив размером 1 Мб, как

byte[] fromArray = new byte[1024*1024]; 

и рассчитать пропускную способность в Мбит/сек, как,

double throughput=1/timeTaken; 

Будет ли разумно рассматривать это как память производительность бенчмаркинга?

+1

Интересное занятие при глубоком копировании. Разумеется, этот метод будет подвержен всем ограничениям сериализации. Вы взглянули на такие рамки, как [Dozer] (http://dozer.sourceforge.net/)? – Perception

+2

Что именно вы пытаетесь сравнить? Как быстро JVM может пересекать граф объектов или как быстро он может считывать из непрерывного блока памяти? Эти два * могут отличаться друг от друга. – SimonC

+0

Я пытаюсь сравнить, как быстро я могу читать и записывать кусок данных (1B, 1Kb и 1Mb) в память. – Prasanna

ответ

2

Интересно, будет ли этот подход работать для глубокой копии.

Будет работать . Однако это не самый эффективный способ реализовать глубокое копирование. (Внедрение глубокой копии вручную, вероятно, на порядок быстрее).

Будет ли переменная, timeTaken дать мне реальное время, чтобы сделать глубокую копию?

зависит от цели. Если JVM был соответствующим образом разогрет, это должно дать точную оценку. Но это мера таким образом делает глубокую копию ... не глубокую копию в общем смысле. (И см. Выше ...)

Будет ли разумным рассматривать это как пропускную способность памяти?

Нет. Работа, связанная с сериализацией и десериализацией объектов, далеко не гетерогенна, чтобы считаться действительным прокси для производительности системы памяти.

В качестве комментария к предложению вам лучше будет копировать данные из одного массива в другой, используя System.arraycopy. Еще лучше, сделайте свой бенчмаркинг на языке, который «ближе к металлу»; например на языке C или ассемблере.


1 - Я предполагаю, что объектный граф вы копируете полностью сериализации.

+0

Глубокое клонирование через сериализацию не работает во всех случаях. В частности, когда классы-члены графа объектов не сериализуются (или только частично, из-за переходных полей). Этот метод также уязвим для плохих реализаций 'writeObject',' readObject', а также пользовательской сериализации. – Perception

1

Простой ответ: Нет, это неправильный подход. Не зная, чего вы пытаетесь достичь, трудно понять, какой должен быть правильный подход, но если вы действительно хотите написать микро-бенчмарк для копирования памяти (!), Тогда вы должны сначала это прочитать: How do I write a correct micro-benchmark in Java?

Смежные вопросы