Показать сообщение отдельно
Старый 28.11.2008, 07:07
ZlPredator вне форума Посмотреть профиль Отправить личное сообщение для ZlPredator Найти все сообщения от ZlPredator
  № 14  
Ответить с цитированием
ZlPredator

Регистрация: Nov 2008
Сообщений: 65
Судя по тестам, флеш оптимизирует хранение простых типов внутри массивов (если в массив сохранять только int, то размер 4 байта на ячейку массива!!!). А вот если сохранять Number, то флеш его сначала обволакивает в объект, и хранит ссылки на эти объекты (в итоге 8 байт double + 4 байт ссылка (на 32бит) ). При присваивании нового значения, если тип неизвестен, то он заново создает объекты оболочки, а старые удаляет (при этом не все, по ходу, оптимизирует для повторного использования, хотя судя по всему, тупо глючит).
System.gc() при этом действительно не помогает - объекты оболочки хранятся в обход сборщика мусора (видимо для уменьшения нагрузки на него).

Чтобы убрать такой эффект, необходимо исправить на:

Код AS3:
package
{
	import flash.display.Sprite;
	import flash.system.System;
 
	public class Main extends flash.display.Sprite
	{
		private var d:Array
 
		public function Main():void
		{
			var n:int = 10000000, i:int;
 
			d = new Array();
			trace(System.totalMemory);
 
			for (i = 0; i < n; ++i)
				d[i] = 0.123;
			trace(System.totalMemory);
 
 
			for (i = 0; i < n; ++i)
				d[i] = Number(d[i]) + Number(d[i]) + Number(d[i]) + Number(d[i]);
			trace(System.totalMemory);
 
		}
	}
}
Тогда компилятор знает тип и не создаёт заново оболочки ( временные скачки по памяти убираются System.gc() или со временем)


Последний раз редактировалось ZlPredator; 28.11.2008 в 10:16.