где требуются пулы автоматического выпуска во вторичном цикле выполнения NSThread? - PullRequest
0 голосов
/ 20 июля 2009

Цикл выполнения для вторичного потока моего приложения ниже. Имеет вложенные циклы управления.

  • Внешний цикл работает в течение всего срока действия приложения
  • Внутренний цикл выполняется, когда открыто одно представление, затем поток ожидает, пока представление не открыто.
  • Проходы по внутренней петле короткие, доли секунды.

Мой код не оставляет заведомо автоматически выпущенные объекты в невыпущенных пулах, но я не знаю, что делает ОС.

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

Внутренний пул автоматического высвобождения охватывает каждый проход через внутренний цикл.

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

внешний пул охватывает весь цикл выполнения.

Как я могу определить, какое влияние создание и выпуск всех этих пулов оказывает на скорость моего кода.
Как определить, необходимы ли все три пула или нет?




код и пояснение:

- (void)processLoop
{

    NSAutoreleasePool * outerPool = [[NSAutoreleasePool alloc] init];
    [processCondition lock];

    //outer loop    
    //this loop runs until my application exits
    while (![[NSThread currentThread] isCancelled])    
    {
        NSAutoreleasePool *middlePool = [[NSAutoreleasePool alloc];
        if(processGo)
        {
            //inner loop
            //this loop runs typically for a few seconds
            while (processGo && ![[NSThread currentThread] isCancelled]) 
            {
                NSAutoreleasePool *innerPool = [[NSAutoreleasePool alloc]; init];
                //within inner loop
                //this takes a fraction of a second
                [self doSomething];
                [innerPool release];
            }
            [self tidyThingsUp];

        }
        else
        {
            [processCondition wait];
        } 
        [middlePool release];
    }
    [processCondition unlock];
    [outerPool release];
}

комбинация:

  • внутренний цикл while
  • NSCondition * processCondition
  • переключение processGo между YES и NO

позволяет мне останавливать и запускать внутренний цикл while, не отменяя поток.

if (processGo == YES)


выполнение входит во внутренний цикл while.

Когда основной поток устанавливает

processGo = NO

выполнение оставляет внутренний цикл while и приводит в порядок
при следующем проходе внешнего цикла выполнение достигает

[processCondition wait]

и ждет

, если основной поток сбрасывается

processGo == YES

и звонки

[processCondition wait]

выполнение снова входит во внутренний цикл

Ответы [ 2 ]

5 голосов
/ 20 июля 2009

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

Есть интересное сообщение в блоге , в котором рассказывается о влиянии дополнительных пулов автоматического выпуска на создание и уничтожение миллиона экземпляров NSObject. Суть поста гласит, что «пулы с автоматическим выпуском стоят дешево»: программа продолжала становиться более эффективной с меньшим количеством объектов на пул вплоть до примерно 10 объектов / 1 пул. (После этого он взлетает до небес, потому что вы быстро приближаетесь к созданию пула для каждого объекта, что явно глупо.)

Лучшее, что вам нужно сделать, - это примерно определить, сколько объектов будет иметь дело с каждым пулом релизов. Например, если ваш внутренний пул обрабатывает сотню объектов за каждый проход, и есть сто проходов, избавление от этого пула добавит десять тысяч объектов в средний пул - это будет плохо. С другой стороны, если внутренний пул обрабатывает один объект каждый проход в течение десяти проходов, тогда, конечно, продолжайте и избавьтесь от него.

Если вы не можете принять решение, посмотрите, сможете ли вы найти способ рассчитать время выполнения только внутреннего цикла или только кода, выполняемого в области среднего пула, а затем добавьте / удалите пулы автоматического освобождения по мере необходимости. И помните: авто-релизные бассейны дешевы.

1 голос
/ 20 июля 2009

Как я могу определить, все ли три Нужны ли бассейны или перебор?

Вы можете просто прокомментировать некоторые из пулов и посмотреть, что происходит с памятью приложения.

Как я могу определить, какой эффект создание и выпуск всех этих бассейны сказываются на скорости моей Код.

Я создаю и выпускаю пул авто-релиза в основном цикле игры, он работает отлично. Без икоты, почти не занимает времени.

...