пулл обектов. как оно на самом деле....
От: Shabi  
Дата: 09.08.07 12:04
Оценка: 2 (1)
Недавно тут, обсуждалась тема по поводу имеет ли смысл кэшировать обекты или положиться на 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



Приведенный пример, когда пулл объектов делится меж потоками и соответственно необходимо использовать объекты синхронизации, далеко не самый лучший подход. Я уже давно использую внутрипотоковые пулы и нет никаких проблем с синхронизацией...выигрыш в быстродействии в сотни раз. и где раэрушенные мифы

Перепроверять нужно информацию, даже если она написана не на заборе.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.