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

Вернуться   Форум Flasher.ru > Обсуждение работ > Не сайты

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 22.07.2013, 17:52
samana вне форума Посмотреть профиль Отправить личное сообщение для samana Найти все сообщения от samana
  № 21  
Ответить с цитированием
samana
 
Аватар для samana

блогер
Регистрация: Mar 2008
Адрес: Днепропетровск
Сообщений: 1,783
Записей в блоге: 3
Выше было мнение, что в цикле for (i=0;i<arr.lenght;i++):
Цитата:
При обращении к length она и не считается каждый раз.
но ведь на самом деле конечно длина массива снова и снова будет пересчитываться при каждой итерации. Или я что-то не понимаю?...

Старый 23.07.2013, 10:50
FlashRus вне форума Посмотреть профиль Отправить личное сообщение для FlashRus Найти все сообщения от FlashRus
  № 22  
Ответить с цитированием
FlashRus
 
Аватар для FlashRus

Регистрация: Nov 2006
Адрес: СПб
Сообщений: 921
Отправить сообщение для FlashRus с помощью ICQ Отправить сообщение для FlashRus с помощью Skype™
Длина масива считается при его изменении, а при обращении к Array#length ничего пересчитываться не будет, т.к. уже всё посчитано.
Было бы действительно удивительно, если бы было иначе, т.к. это краней не оптимальный расход ресурсов.

Старый 23.07.2013, 11:32
Tails вне форума Посмотреть профиль Отправить личное сообщение для Tails Найти все сообщения от Tails
  № 23  
Ответить с цитированием
Tails
 
Аватар для Tails

блогер
Регистрация: Dec 2008
Адрес: г. Чебоксары
Сообщений: 2,259
Записей в блоге: 6
Длина массива не пересчитывается при изменений, она считается при обращений к length, каждый раз. Этому есть вполне разумное объяснение - не всегда при добавлений элементов в массив, его длину нужно пересчитывать. Это был-бы ещё более не оптимальный расход ресурсов.

Другими словами, давая разработчику возможность самому пересчитывать длину массива, когда ему нужно (обращаясь к length), плеер фактически даёт гибкий инструмент для оптимизаций.
При пересчёте длины с каждым добавлением - этой возможности нет.

Такой вывод я сделал исходя из теста с частым обращением к length. Длина пересчитывается с каждым обращением. Остальное - догадки.
__________________
Дети не должны знать о своих родителях

Старый 23.07.2013, 11:41
FlashRus вне форума Посмотреть профиль Отправить личное сообщение для FlashRus Найти все сообщения от FlashRus
  № 24  
Ответить с цитированием
FlashRus
 
Аватар для FlashRus

Регистрация: Nov 2006
Адрес: СПб
Сообщений: 921
Отправить сообщение для FlashRus с помощью ICQ Отправить сообщение для FlashRus с помощью Skype™
Цитата:
Длина массива не пересчитывается при изменений, она считается при обращений к length, каждый раз. Этому есть вполне разумное объяснение - не всегда при добавлений элементов в массив, его длину нужно пересчитывать. Это был-бы ещё более не оптимальный расход ресурсов.
На мой взгляд гораздо разумнее инкриментировать некую переменню при добавлении элементов, чем нежели при обращении к length пересчитывать элементы.
_length ++ разве является расходной операцией?

Мои догадки хорошо иллюстрированы листигом из тамарина здесь.

Старый 23.07.2013, 11:53
Tails вне форума Посмотреть профиль Отправить личное сообщение для Tails Найти все сообщения от Tails
  № 25  
Ответить с цитированием
Tails
 
Аватар для Tails

блогер
Регистрация: Dec 2008
Адрес: г. Чебоксары
Сообщений: 2,259
Записей в блоге: 6
Значит я ошибся с выводом.
А причина тормозов при обращений к длине в цикле - двойной вызов функций * на количество итераций. Всяко благоразумнее будет перед выполнением цикла занести длину в отдельную локальную переменную.
__________________
Дети не должны знать о своих родителях

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

Регистрация: Nov 2006
Адрес: СПб
Сообщений: 921
Отправить сообщение для FlashRus с помощью ICQ Отправить сообщение для FlashRus с помощью Skype™
Цитата:
Всяко благоразумнее будет перед выполнением цикла занести длину в отдельную локальную переменную.
Надо потестить это дело.
А что касается прошлого вопроса, вот результаты моих тестов:

Длина, начальный момент времени, конечный и дельта.

0 => 987, 987, 0
1000 => 987, 987, 0
10000000 => 1929, 1929, 0

Код AS3:
addEventListener(MouseEvent.CLICK, clickHandler)
var arr:Array = [];
var currLength:int;
var t0:int;
var t1:int;
var i:int;
 
function clickHandler(e:MouseEvent):void {
	calculateAndAppendData()	
	for (i = 0; i < 1000; i++) {
		arr.push(Math.random())
	}
	calculateAndAppendData();
	arr = [];
	for (i = 0; i < 10000000; i++) {
		arr.push(Math.random())
	}
	calculateAndAppendData();
}
 
function calculateAndAppendData():void {
	t0 = getTimer();
	currLength = arr.length;
	t1 = getTimer();
	tf.appendText(currLength + " => " + t0 + ", " + t1 + ", " + (t1 - t0) + "\n");
}
Добавлено через 17 минут
Цитата:
Всяко благоразумнее будет перед выполнением цикла занести длину в отдельную локальную переменную.
По результатам теста благорзаумнее на 4мс при миллионной длине массива.

(i = 0; i < arr.length; i++) => 1032, 1048, 16
(i = 0; i < localLength; i++) => 1048, 1060, 12

Код AS3:
	t0 = getTimer();
	for (i = 0; i < arr.length; i++) {
		arr[i]
	}
	t1 = getTimer();
	tf.appendText("(i = 0; i < arr.length; i++) => " + t0 + ", " + t1 + ", " + (t1 - t0) + "\n");
 
	t0 = getTimer();
	var localLength:int = arr.length;
	for (i = 0; i < localLength; i++) {
		arr[i]
	}
	t1 = getTimer();
	tf.appendText("(i = 0; i < localLength; i++) => " + t0 + ", " + t1 + ", " + (t1 - t0) + "\n");


Последний раз редактировалось FlashRus; 23.07.2013 в 12:20.
Старый 23.07.2013, 12:51
Tails вне форума Посмотреть профиль Отправить личное сообщение для Tails Найти все сообщения от Tails
  № 27  
Ответить с цитированием
Tails
 
Аватар для Tails

блогер
Регистрация: Dec 2008
Адрес: г. Чебоксары
Сообщений: 2,259
Записей в блоге: 6
Вы используете переменные уровня класса, доступ к ним более медленный, по сравнению с доступом к переменным метода/функций. Это может сглаживать результаты.

Вот мои результаты тестов:
Array:
Код:
localLength: 200ms
arr.length: 333ms
Миллион итераций, разница скорости выполнения: 1.6

Vector (no fixed):
Код:
localLength: 88ms
arr.length: 111ms
10 миллионов итераций, разница скорости выполнения: 1.2

Vector (fixed):
Код:
localLength: 88ms
arr.length: 113ms
10 миллионов итераций, разница скорости выполнения: 1.2

Код AS3:
import flash.events.MouseEvent;
 
 
stage.addEventListener(MouseEvent.CLICK, clickHandler)
 
 
function clickHandler(e:MouseEvent):void {
	const itterations:uint		= 1000000;
	//const arr:Array				= new Array(itterations);
	const arr:Array				= new Array(itterations);
	var i:uint;
	var t1:uint;
	var t2:uint;
 
	t1							= getTimer();
	for(i = 0; i < itterations; i ++){
		arr[i];
	}
	t2							= getTimer();
	trace('localLength: '+ (t2 - t1) + 'ms');
 
	t1							= getTimer();
	for(i = 0; i < arr.length; i ++){
		arr[i];
	}
	t2							= getTimer();
	trace('arr.length: '+ (t2 - t1) + 'ms');
}
__________________
Дети не должны знать о своих родителях


Последний раз редактировалось Tails; 23.07.2013 в 13:23.
Старый 23.07.2013, 12:58
FlashRus вне форума Посмотреть профиль Отправить личное сообщение для FlashRus Найти все сообщения от FlashRus
  № 28  
Ответить с цитированием
FlashRus
 
Аватар для FlashRus

Регистрация: Nov 2006
Адрес: СПб
Сообщений: 921
Отправить сообщение для FlashRus с помощью ICQ Отправить сообщение для FlashRus с помощью Skype™
Компиляция в релизе была?

Цитата:
Вы используете переменные уровня класса, доступ к ним более медленный, по сравнению с доступом к переменным метода/функций. Это может сглаживать результаты.
Не подумал об этом. Всё верно, скорость выше примерно в два раза.

Старый 23.07.2013, 13:25
Tails вне форума Посмотреть профиль Отправить личное сообщение для Tails Найти все сообщения от Tails
  № 29  
Ответить с цитированием
Tails
 
Аватар для Tails

блогер
Регистрация: Dec 2008
Адрес: г. Чебоксары
Сообщений: 2,259
Записей в блоге: 6
Нет, как всегда забыл про это. Обновил результаты в соответствий с релизной компиляцией.
__________________
Дети не должны знать о своих родителях

Старый 14.08.2013, 18:46
Hauts вне форума Посмотреть профиль Отправить личное сообщение для Hauts Посетить домашнюю страницу Hauts Найти все сообщения от Hauts
  № 30  
Ответить с цитированием
Hauts
 
Аватар для Hauts

блогер
Регистрация: Feb 2008
Адрес: Россия, Новосибирск, Академгородок
Сообщений: 2,113
Записей в блоге: 1
Отправить сообщение для Hauts с помощью ICQ Отправить сообщение для Hauts с помощью Skype™
Относительно задания — там явно прописано, что должны быть кнопки "+" и "-", у автора это "add" и "minus" (еще и total есть). Это мелочь, конечно, но всё-таки, мне кажется, что нужно подходить очень внимательно к подобным вещам.

По коду:

Код AS3:
private var planets:Vector.<Planet>;
— я бы посчитал большим недочетом. С моей точки зрения нужно было так:
Код AS3:
private var _planets:Vector.<Planet>;
"onClick", "onMove" и т.д. я бы переписал на "mouseClickHandler" или типа того. Хотя это не ошибка, да.

Про "for (var i:int = 0; i < planets.length; i++)" уже говорили.

В Universe свойство graphics вполне можно закэшировать.


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

Добавлено через 2 минуты
А, и еще:

Цитата:
Причина: не оптимизированный код.
Мне кажется, это довольно-таки, нехорошо в таком формате отвечать на выполненные тестовые задания. В хорошем случае я (как соискатель) ожидаю получить нормальный развёрнутый ответ.
__________________
hauts.ru

Создать новую тему Ответ Часовой пояс GMT +4, время: 20:19.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

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

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


 


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


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