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

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 14.09.2015, 19:42
Bletraut вне форума Посмотреть профиль Отправить личное сообщение для Bletraut Найти все сообщения от Bletraut
  № 1  
Ответить с цитированием
Bletraut
 
Аватар для Bletraut

Регистрация: Mar 2013
Адрес: Вне пространства.
Сообщений: 566
Отправить сообщение для Bletraut с помощью ICQ Отправить сообщение для Bletraut с помощью Skype™
По умолчанию Изменение данных в массиве

Собственно возможно ли быстро, без перебора каждого элемента, превратить вот это
Код AS3:
var a:Array = ["1", "2", "3", "4", "5"]
вот в это
Код AS3:
a = [1, 2, 3, 4, 5]
???
__________________
Я заклинаю вас действовать иначе.

Старый 14.09.2015, 19:47
illuzor вне форума Посмотреть профиль Отправить личное сообщение для illuzor Найти все сообщения от illuzor
  № 2  
Ответить с цитированием
illuzor
 
Аватар для illuzor

Регистрация: Dec 2010
Адрес: Ярославль
Сообщений: 1,255
Без перебора никак

Старый 14.09.2015, 20:17
AlexCooper вне форума Посмотреть профиль Отправить личное сообщение для AlexCooper Найти все сообщения от AlexCooper
  № 3  
Ответить с цитированием
AlexCooper
 
Аватар для AlexCooper

Регистрация: Sep 2008
Адрес: Черкассы
Сообщений: 1,167
Записей в блоге: 1
Отправить сообщение для AlexCooper с помощью ICQ Отправить сообщение для AlexCooper с помощью Skype™
Код AS3:
function setUintType(value:String, index:int, array:Array):uint
{
	return uint(value);
}
 
a = a.map(setUintType, null);
Добавлено через 11 минут
но это так же перебор элементов. Просто упрощение сокращение записи. Можно свести до
Код AS3:
a = a.map(function(...v):uint{return v[0]}, null);
Добавлено через 1 час 5 минут
Провёл замеры.

Код AS3:
package
{
	import flash.display.Sprite;
	import flash.utils.getTimer;
	import flash.utils.setTimeout;
 
	public class w2 extends Sprite
	{
		private var a:Array;
		private var t:int;
		private var funcRoute:Array;
 
		public function w2()
		{
		 	a = [];
 
			var count:uint = 1000000;
 
			while(--count) {
				a.push( String( uint(Math.random()*1000) ) );	
			}
 
			funcRoute = [ undefinedFunc, undefinedMultiFunc, externalFunction, internalfunction, forinFunction, foreachFunction];
 
			nextstep();
 
		}
 
		private function undefinedFunc():void
		{
			start();
 
			var b:Array = a.map
						(	function(value:String, index:int, array:Array):uint{ return uint(value); }, 
							null
						);
 
			calc();
 
			nextstep();
		}
 
 
		private function undefinedMultiFunc():void
		{
			start();
 
			var b:Array = a.map(function(...v):uint{return v[0]}, null);
 
			calc();
 
			nextstep();
		}
 
		private function externalFunction():void {
 
			start();
 
			var b:Array = a.map(setUintType, null);
 
			calc();
 
			nextstep();
		}
 
		private function internalfunction():void
		{
			start();
 
			function internalfunc(value:String, index:int, array:Array):uint
			{
				return uint(value);
			}
 
			var b:Array = a.map(internalfunc, null);
 
			calc();
 
			nextstep();
		}
 
		private function forinFunction():void
		{
			var b:Array = [];
 
			start();
 
			for(var i:uint=0; i<a.length; i++) {
				b.push(uint(a[i]));
			}
 
			calc();
 
			nextstep();
		}
 
		private function foreachFunction():void
		{
			var b:Array = [];
 
			start();
 
			for each(var v:String in a){
				b.push( uint(v) );
			}
 
			calc();
 
			nextstep();
		}
 
		private function calc():void
		{
 
			var timeoffset:uint = 	getTimer()-t;
 
			var err:Object;
 
			try {
				err.call();
			} catch (e:*) {
 
				var msg:String = e.getStackTrace();
 
				var arr:Array = msg.split('/');
 
				var caller:Array = arr[2].split('(');
 
				var functname:String = caller[0];
 
			}
 
			trace(functname+" -> "+ timeoffset);
		}
 
		private function start():void
		{
			t = getTimer();
		}
 
		private function setUintType(value:String, index:int, array:Array):uint
		{
			return uint(value);
		}
 
		private function nextstep():void
		{
			if (funcRoute.length) {
				setTimeout( funcRoute.shift(), 3000);
			}
		}
	}
}
Цитата:
undefinedFunc -> 392
undefinedMultiFunc -> 855
externalFunction -> 369
internalfunction -> 382
forinFunction -> 419
foreachFunction -> 257
наиболее продуктивным будет вариант

Код AS3:
var b:Array = [];
for each(var v:String in a){
	b.push( uint(v) );
}
a = b;
__________________
return this...


Последний раз редактировалось AlexCooper; 14.09.2015 в 20:41.
Старый 14.09.2015, 21:44
Bletraut вне форума Посмотреть профиль Отправить личное сообщение для Bletraut Найти все сообщения от Bletraut
  № 4  
Ответить с цитированием
Bletraut
 
Аватар для Bletraut

Регистрация: Mar 2013
Адрес: Вне пространства.
Сообщений: 566
Отправить сообщение для Bletraut с помощью ICQ Отправить сообщение для Bletraut с помощью Skype™
Спасибо!
__________________
Я заклинаю вас действовать иначе.

Старый 15.09.2015, 18:26
nuToH вне форума Посмотреть профиль Отправить личное сообщение для nuToH Найти все сообщения от nuToH
  № 5  
Ответить с цитированием
nuToH
 
Аватар для nuToH

Регистрация: Mar 2006
Адрес: Ростов-на-Дону
Сообщений: 80
Код AS3:
var a:Array = ["1", "2", "3", "4", "5"];
var b:Vector.<Number> = Vector.<Number>( a );
вот такую типизацию еще можно использовать

Старый 15.09.2015, 18:43
Bletraut вне форума Посмотреть профиль Отправить личное сообщение для Bletraut Найти все сообщения от Bletraut
  № 6  
Ответить с цитированием
Bletraut
 
Аватар для Bletraut

Регистрация: Mar 2013
Адрес: Вне пространства.
Сообщений: 566
Отправить сообщение для Bletraut с помощью ICQ Отправить сообщение для Bletraut с помощью Skype™
Цитата:
Сообщение от nuToH Посмотреть сообщение
Код AS3:
var a:Array = ["1", "2", "3", "4", "5"];
var b:Vector.<Number> = Vector.<Number>( a );
вот такую типизацию еще можно использовать
Вот это вообще идеально!
__________________
Я заклинаю вас действовать иначе.

Старый 16.09.2015, 01:18
udaaff вне форума Посмотреть профиль Отправить личное сообщение для udaaff Найти все сообщения от udaaff
  № 7  
Ответить с цитированием
udaaff
...

модератор форума
Регистрация: Sep 2006
Адрес: Minsk
Сообщений: 4,286
for можно слегка ускорить.
Код AS3:
for(var i:int = a.length - 1; i > -1; i--) {
	b[i] = int(a[i]);
}
+ самый быстрый вариант у меня получился
Код AS3:
for (var i:int in a)
{
     b[i] = int(a[i]);
}
Код:
undefinedFunc -> 260
undefinedMultiFunc -> 550
externalFunction -> 235
internalfunction -> 234
forFunction -> 250
foreachFunction -> 141
forinFunction -> 110
newforFunction -> 140
array2vectorFunction -> 265
Цитата:
Сообщение от nuToH Посмотреть сообщение
Код AS3:
var a:Array = ["1", "2", "3", "4", "5"];
var b:Vector.<Number> = Vector.<Number>( a );
вот такую типизацию еще можно использовать
Медленнее цикла, кстати, получается.

+ for each + push не гарантируют порядок элементов, если в массиве будут отсутствоват элементы.

upd:
если кто-то будет когда-то это читать, знайте что тестить в дебаге не верно и в релизе получились совсем иные результаты.
самый быстрый - цикл с обратным перебором.


Последний раз редактировалось udaaff; 07.10.2015 в 02:34.
Создать новую тему Ответ Часовой пояс GMT +4, время: 08:33.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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