Недавно тут, обсуждалась тема по поводу имеет ли смысл кэшировать обекты или положиться на VM и пусть они создаються себе...Статьи приводились разные, где выигрышь от повторного использования объектов объявлялсь мифом.
И все как бы с этим согласились, что удивительно. Я тоже было подумал что живу в плену устаревших стериотипов.
Решил проверить как оно на практике.
public class Test
{
public static void main(String[] args)
{
long t = System.currentTimeMillis();
Rectangle arr = new Rectangle();
t = System.currentTimeMillis();
Rectangle c=new Rectangle ();
for (int i = 0; i < 1000000; i++)
{
synchronized (c)
{
arr = c;//тут иммитируем получение объекта из пула
}
arr.width =i; // типа используем объект
synchronized (arr)
{
c= arr;//тут этот объект возвращаем
}
}
t = System.currentTimeMillis() - t;
System.out.println(arr + ">>>>>" + t);
System.out.println(c + ">>>>>" + t);
t = System.currentTimeMillis();
for (int i = 0; i < 1000000; i++)
{
arr = new Rectangle();
arr.width =i; // типа используем объект
}
t = System.currentTimeMillis() - t;
System.out.println(arr+ "----" + t);
}
}
такой код выдает
java.awt.Rectangle[x=0,y=0,width=999999,height=0]>>>>>32
java.awt.Rectangle[x=0,y=0,width=999999,height=0]>>>>>32
java.awt.Rectangle[x=0,y=0,width=999999,height=0]----78
те повторное использование объектов в 2 раза быстрее отрабатывает, чем просто создание нового объекта
и это на примере такого примитивного объекта как java.awt.Rectangle.
Напрактике же все ка правило серьезнее. Если вместо java.awt.Rectangle взять Component то будет так
Test$2[,0,0,0x0,invalid]>>>>>31
Test$2[,0,0,0x0,invalid]>>>>>31
Test$3[,0,0,0x0,invalid]----781
Приведенный пример, когда пулл объектов делится меж потоками и соответственно необходимо использовать объекты синхронизации, далеко не самый лучший подход. Я уже давно использую внутрипотоковые пулы и нет никаких проблем с синхронизацией...выигрыш в быстродействии в сотни раз. и где раэрушенные мифы
Перепроверять нужно информацию, даже если она написана не на заборе.