Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Блоги > Идеи и творения

Буду делиться тем что делаю.
Оценить эту запись

Vector быстрее Array?

Запись от Герыч размещена 01.08.2009 в 13:14
Обновил(-а) Герыч 09.08.2009 в 00:05

Любопытство не даёт спокойно жить
Провёл такие вот тесты с массивами:
Код AS3:
var v:Vector.<int>;
var a:Array;
var i:int;
var j:int;
var k:int;
var size:int=300;
var search:int=299;
/////////////////////////////
//Конструктор без указания размера
var t1=getTimer();
for(i=0;i<100000;i++)
	v=new Vector.<int>();
t1=getTimer()-t1;
var t2=getTimer();
for(i=0;i<100000;i++)
	a=new Array();
t2=getTimer()-t2;
/////////////////////////////
//Конструктор с указанием размера
var t3=getTimer();
for(i=0;i<100000;i++)
	v=new Vector.<int>(size,true);
t3=getTimer()-t3;
var t4=getTimer();
for(i=0;i<100000;i++)
	v=new Vector.<int>(size);
t4=getTimer()-t4;
var t5=getTimer();
for(i=0;i<100000;i++)
	a=new Array(size);
t5=getTimer()-t5;
/////////////////////////////
//Доступ к элементу для записи
v=new Vector.<int>(size,true);
a=new Array(size);
var t6=getTimer();
for(i=0;i<100000;i++)
	for(j=0;j<size;j++)
		v[j]=10;
t6=getTimer()-t6;
var t7=getTimer();
for(i=0;i<100000;i++)
	for(j=0;j<size;j++)
		a[j]=10;
t7=getTimer()-t7;
/////////////////////////////
//Доступ к элементу для чтения
var t8=getTimer();
for(i=0;i<100000;i++)
	for(j=0;j<size;j++)
		k=v[j];
t8=getTimer()-t8;
var t9=getTimer();
for(i=0;i<100000;i++)
	for(j=0;j<size;j++)
		k=a[j];
t9=getTimer()-t9;
/////////////////////////////
//Заполнение пустого массива
var t10=getTimer();
for(i=0;i<100000;i++)
{
	v=new Vector.<int>();
	for(j=0;j<size;j++)
		v.push(j);
}
t10=getTimer()-t10;
var t11=getTimer();
for(i=0;i<100000;i++)
{
	a=new Array();
	for(j=0;j<size;j++)
		a.push(j);
}
t11=getTimer()-t11;
/////////////////////////////
//Поиск элемента search
var t12=getTimer();
for(i=0;i<10000;i++)
	k=v.indexOf(search);
t12=getTimer()-t12;
var t13=getTimer();
for(i=0;i<10000;i++)
	k=a.indexOf(search);
t13=getTimer()-t13;
/////////////////////////////
//Показываем что получилось и сравниваем)
trace("Конструктор без указания размера",t1,t2);
trace("Конструктор с указанием размера",t3,t4,t5);
trace("Доступ к элементу для записи",t6,t7);
trace("Доступ к элементу для чтения",t8,t9);
trace("Заполнение пустого массива",t10,t11);
trace("Поиск элемента search",t12,t13);
Полученные результаты:
size=300,search=0
Код:
Конструктор без указания размера 173 209
Конструктор с указанием размера 300 302 268
Доступ к элементу для записи 577 1315
Доступ к элементу для чтения 530 829
Заполнение пустого массива 5724 6892
Поиск элемента search 6 5
size=300,search=299
Код:
Конструктор без указания размера 179 212
Конструктор с указанием размера 285 276 267
Доступ к элементу для записи 569 1319
Доступ к элементу для чтения 531 823
Заполнение пустого массива 5708 7464
Поиск элемента search 88 97
Результаты тестов могут колебаться, но в целом несколько запусков подтвердили, что на этих операциях Vector лучше, чем Array
Другие операции проверяйте сами, мне были нужны только эти
Всего комментариев 1

Комментарии

Старый 17.12.2011 20:32 expl вне форума
expl
Операции требующие перестройки у Vector'a медленнее работают. Например вставка и удаление произвольных элементов.

Правда, различие небольшое, по крайней мере на дебажном флешплеере в релизной флешке:
Код AS3:
package 
{
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.text.TextField;
	import flash.text.TextFieldAutoSize;
	import flash.utils.getTimer;
 
	public class Main extends Sprite 
	{
 
		public function Main():void 
		{
			if (stage) init();
			else addEventListener(Event.ADDED_TO_STAGE, init);
		}
 
		private function init(e:Event = null):void 
		{
			removeEventListener(Event.ADDED_TO_STAGE, init);
 
			var tf:TextField = new TextField();
			tf.autoSize = TextFieldAutoSize.LEFT;
			addChild(tf);
 
			var time:int;
			var vectorTime:int;
			var arrayTime:int;
			var i:int;
 
			var array:Array = [
				1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20
			];
			var vector:Vector.<int> = Vector.<int>(array);
 
			time = getTimer();
			for (i = 0; i < 10000; i++)
			{
				array.splice(2, 1);
				array.splice(2, 0, 12);
			}
			arrayTime = getTimer() - time;
			time = getTimer();
			for (i = 0; i < 10000; i++)
			{
				vector.splice(2, 1);
				vector.splice(2, 0, 12);
			}
			vectorTime = getTimer() - time;
			tf.appendText("splice(2, 1): vectorTime=" + vectorTime + ", arrayTime=" + arrayTime);
                        //splice(2, 1): vectorTime=184, arrayTime=142
		}
 
	}
 
}
Хотя, все зависит от того, как тестировать
Код AS3:
var tf:TextField = new TextField();
			tf.autoSize = TextFieldAutoSize.LEFT;
			addChild(tf);
 
			var time:int;
			var vectorTime:int;
			var arrayTime:int;
			var i:int;
 
			var array:Array = [
				1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20
			];
			var vector:Vector.<int> = Vector.<int>(array);
 
			time = getTimer();
			for (i = 0; i < 10000; i++)
			{
				array.splice(i, 0, i);
			}
			arrayTime = getTimer() - time;
			time = getTimer();
			for (i = 0; i < 10000; i++)
			{
				vector.splice(i, 0, i);
			}
			vectorTime = getTimer() - time;
			tf.appendText("splice(2, 1): vectorTime=" + vectorTime + ", arrayTime=" + arrayTime);
                        //splice(2, 1): vectorTime=93, arrayTime=321
Кстати, разве trace работает в релизном режиме?
Обновил(-а) expl 17.12.2011 в 21:10
 

 


Часовой пояс GMT +4, время: 22:42.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.