AS3 - Переработка объектов - PullRequest
2 голосов
/ 18 декабря 2011

Является ли это правильным, наиболее эффективным способом переработки объектов при создании массива объектов?

package com {
    public class CreateList extends MovieClip {
        //this is the object I will be recycling
        private var newProperty:PropertyRow;

        //this is the array I will use to reference the objects
        private var _theRows:Array = new Array();

        public function CreateList() {
            for (var i:uint = 0; i < 1000; i++ ) {
                //null the object
                newProperty = null;

                //create a new instance of the object
                newProperty = new PropertyRow();

                //store a reference to the object before nulling it in the next for loop cycle.
                _theRows.push(newProperty);
            }

            //null the last object that was created in the for loop
            newProperty = null;
        }
    }
}

Ответы [ 2 ]

4 голосов
/ 18 декабря 2011

Использование ключевого слова new создаст новый экземпляр PropertyRow.GC не освободит память после установки переменной null, потому что экземпляры все еще сохраняются в массиве.Следовательно, использование переменной-члена не принесет никакого преимущества в производительности по сравнению с использованием временной переменной в цикле создания.

Если вы собираетесь оптимизировать свой код для повышения производительности, сначала вы должны всегда пытаться использовать Векторы вместо массивов.

ВАЖНОЕ РЕДАКТИРОВАНИЕ

Как я выяснил при тестировании векторной производительности для другой вопрос , это верно только для числовых типов!Если вы собираетесь использовать вектор любого типа объекта, массив будет на самом деле быстрее!Остальная часть моего ответа ниже все еще применима - просто используйте массивы вместо Vector.<PropertyRow>.

END EDIT

Тогда, если этого можно избежать, не используйтеpush (), но синтаксис скобок (только если вы знаете точный размер вектора - это важно, иначе синтаксис скобок не сработает):

var vec_size:int = 1000;
var myArray:Array = new Array (vec_size); 
for (var i : int = 0; i< vec_size; i++) {
    myArray[i] = new PropertyRow(); // if you're not setting any properties, you won't even need a temp variable ;)
}

Если вы беспокоитесь о сборке мусора иповторное использование объектов, также проверьте ссылку Adobe на пул объектов .

1 голос
/ 18 декабря 2011

Вам не нужно создавать поле для этого временного объекта.

package com {
    public class CreateList extends MovieClip {
        //this is the array I will use to reference the objects
        private var _theRows:Array = new Array();

        public function CreateList() {
            var newProperty:PropertyRow;
            for (var i:uint = 0; i < 1000; i++ ) {
                //create a new instance of the object
                newProperty = new PropertyRow();
                //store a reference to the object before nulling it in the next for loop cycle.
                _theRows.push(newProperty); 
            }
        }
    } 
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...