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

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

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

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
По умолчанию Заблуждения в оптимизации

Создал эту тему просто, чтобы поделиться опытом своих заблуждений)

Несколько раз читал разные блоги и сайты по оптимизации приложений, и последний раз читал статью Дэниэла по оптимизации кода в старлинге.
Сам код для потимизации stage3d оставлю, меня заинтересовало то, что он рекомендовал избегать использования for each циклов, и заменять их на for var i:int ...
Но мои замеры показали, что разница в скорости между этими циклами составляет почти 3 раза! Причем совсем не в пользу вторых.

Тест содержит ошибку, ответ здесь
Вот мой тест на 10 миллионах объектов
Код AS3:
// создаем 10 миллионов объектов с одним свойством
var array:Array = []
for (var i:int = 0; i < 10000000; i++) {
	array.push( { t: 1 } );
}
 
var length:int = array.length;
var obj:Object = null;
var time:int = getTimer();
for (i = 0; i < length; i++) {
	obj = array[i];
	obj.t = 0;
}
trace("FOR i", getTimer() - time); // 1554
time = getTimer();
for each (obj in array) {
	obj.t = 0;
}
trace("FOR EACH", getTimer() - time); // 671
Но если тут я сам и ожидал примерно такого результата, то вот хорошей скорости работы от Math методов точно не ожидал. А оказалось, что они лишь немного проигрывают в скорости инлайнам. И ощутимо это только на огромном количестве итераций.
Вот еще пример
Код AS3:
public function MathCrap() {
 
 
	var number:Number = -14;
	var i:int = 0;
	var result:Number = 0;
	var time:int = 0;
 
	time = getTimer();
	for (i = 0; i < 10000000; i++) {
		result = Math.abs(number);
	}
	trace("Math.abs()", getTimer() - time); 
	time = getTimer();
	for (i = 0; i < 10000000; i++) {
		result = abs(number);
	}
	trace("Inline abs", getTimer() - time);
	trace("CEIL >>>");
	number = 1.5;
	time = getTimer();
	for (i = 0; i < 10000000; i++) {
		result = Math.ceil(number);
	}
	trace("Math.ceil()", getTimer() - time); 
	time = getTimer();
	for (i = 0; i < 10000000; i++) {
		result = ceil(number);
	}
	trace("Inline ceil", getTimer() - time);
 
}
[Inline]
public static function abs(value:Number):Number {
	return value > 0 ? value : -value;
}
[Inline]
public static function ceil(value:Number):int {
	return int(value) + 1;
}
Результат такой:
Код AS3:
Math.abs() 1328
Inline abs 1139
CEIL >>>
Math.ceil() 1348
Inline ceil 1139
То есть совсем незначительная разница, хотя я расчитывал увидеть цифры раза в 2, а то и в 3 различающиеся. Видимо Адоби хорошо поработали над оптимизацией кода в ASC 2.0
__________________
Ко мне можно и нужно обращаться на ты)


Последний раз редактировалось caseyryan; 26.02.2016 в 09:15.
Старый 24.02.2016, 11:27
Korchy вне форума Посмотреть профиль Отправить личное сообщение для Korchy Найти все сообщения от Korchy
  № 2  
Ответить с цитированием
Korchy
 
Аватар для Korchy

Регистрация: May 2011
Сообщений: 301
Записей в блоге: 2
Цитата:
Сообщение от caseyryan Посмотреть сообщение
он рекомендовал избегать использования for each циклов, и заменять их на for var i:int ...
Обычно each-циклы не рекомендуют использовать из-за того, что не гарантируется порядок обхода. А по скорости ни разу не встречал таких рекомендаций.
__________________
interplanety

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

блогер
Регистрация: Feb 2008
Адрес: http://playtika.com
Сообщений: 1,119
Записей в блоге: 5
Отправить сообщение для СлаваRa с помощью ICQ Отправить сообщение для СлаваRa с помощью Skype™
Цитата:
Сообщение от Korchy Посмотреть сообщение
Обычно each-циклы не рекомендуют использовать из-за того, что не гарантируется порядок обхода. А по скорости ни разу не встречал таких рекомендаций.
а документацию вы читали про for-each циклы?
__________________
местонахождение

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

Регистрация: May 2011
Сообщений: 301
Записей в блоге: 2
Цитата:
Сообщение от СлаваRa Посмотреть сообщение
а документацию вы читали про for-each циклы?
Вполне мог что-то и пропустить )
__________________
interplanety

Старый 24.02.2016, 11:30
i.o. вне форума Посмотреть профиль Отправить личное сообщение для i.o. Найти все сообщения от i.o.
  № 5  
Ответить с цитированием
i.o.
 
Аватар для i.o.

Регистрация: Apr 2010
Адрес: Earth
Сообщений: 1,897
Результаты в DEBUG и RELEASE версиях плеера могут сильно отличаться. Судя по трейсам использовался именно дебажный вариант

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

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Цитата:
Обычно each-циклы не рекомендуют использовать из-за того, что не гарантируется порядок обхода. А по скорости ни разу не встречал таких рекомендаций.
Да. Но он там говорил именно о скорости работы, поэтому меня это и заинтересовало. Так как я всегда был уверен что for in и for each in гораздо быстрее упорядоченных циклов
Вот цитата Дэниэла
Цитата:
Loops

When working with loops that are repeated very often or are deeply nested, it's better to avoid “for each”; the classic “for i” yields a better performance. Furthermore, beware that the loop condition is executed once per loop, so it's faster to save it into an extra variable.
Цитата:
Сообщение от i.o. Посмотреть сообщение
Результаты в DEBUG и RELEASE версиях плеера могут сильно отличаться. Судя по трейсам использовался именно дебажный вариант
Блин, а ведь верно. Я даже не подумал) Туплю.
Сделал релизный тест, и мои изначальные ожидания оправдались с лихвой.
Вот для релиза:

Код AS3:
public function MathCrap() {
 
	var tf:TextField = new TextField();
	tf.width = 800;
	tf.height = 600;
	addChild(tf);
 
	var number:Number = -14;
	var i:int = 0;
	var result:Number = 0;
	var time:int = 0;
 
	time = getTimer();
	for (i = 0; i < 10000000; i++) {
		result = Math.abs(number);
	}
	tf.appendText("Math.abs() " + (getTimer() - time) + "\n"); 
	time = getTimer();
	for (i = 0; i < 10000000; i++) {
		result = abs(number);
	}
	tf.appendText("Inline abs " + (getTimer() - time) + "\n");
	tf.appendText("CEIL >>>");
	number = 1.5;
	time = getTimer();
	for (i = 0; i < 10000000; i++) {
		result = Math.ceil(number);
	}
	tf.appendText("Math.ceil() " + (getTimer() - time) + "\n");
	time = getTimer();
	for (i = 0; i < 10000000; i++) {
		result = ceil(number);
	}
	tf.appendText("Inline ceil " + (getTimer() - time) + "\n");
 
}
[Inline]
public static function abs(value:Number):Number {
	return value > 0 ? value : -value;
}
[Inline]
public static function ceil(value:Number):int {
	return int(value) + 1;
}
Код AS3:
Math.abs() 528
Inline abs 85
CEIL >>>Math.ceil() 549
Inline ceil 55
То то же

Никогда не думал, что придется настолько заморачиваться с оптимизацией приложений)
__________________
Ко мне можно и нужно обращаться на ты)

Старый 01.03.2016, 22:49
dimarik вне форума Посмотреть профиль Отправить личное сообщение для dimarik Найти все сообщения от dimarik
  № 7  
Ответить с цитированием
dimarik
.
 
Аватар для dimarik

модератор форума
Регистрация: Sep 2003
Адрес: Москва
Сообщений: 4,630
Записей в блоге: 20
Цитата:
Сообщение от caseyryan Посмотреть сообщение
Да. Но он там говорил именно о скорости работы, поэтому меня это и заинтересовало. Так как я всегда был уверен что for in и for each in гораздо быстрее упорядоченных циклов
Вот цитата Дэниэла<..skipped..>
Цитата Даниэльки... Мля.. Это тот, что выкатил недавно srarling 2.0 beta. Слов нет.

Добавлено через 10 минут
Он тут недавно, в своем srarling 2.0 выяснил, что если байтаррею при рождении выставить length, то он (ByteArray) якобы не вылезет из 4 kB. Это просто феерично. Попробовал бы он так сделать в мичети в ios.

Добавлено через 14 минут
Попытался я пощупать его новый старлинг. Крутая штука, по сравнению с его предыдущей поделкой. Попробуйте повращать спрайт с 16к детей. И попробуйте повращять одно дитё из 16к в этом спрайте. Результат впечатляющий. Вращение спрайта вызывает полный переобход и перерендеринг. Вращение дитя незаметно. Это достижение, я щитаю.

Чувак просто не знаком с поддеревьями и за корень всегда использует стейдж.
__________________
Воспитан в TimeZero. Работаю в Mail.ru.


Последний раз редактировалось dimarik; 01.03.2016 в 23:05.
Старый 02.03.2016, 05:59
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 8  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Цитата:
Сообщение от dimarik Посмотреть сообщение
Цитата Даниэльки... Мля.. Это тот, что выкатил недавно srarling 2.0 beta. Слов нет.
Чувак просто не знаком с поддеревьями и за корень всегда использует стейдж.
Сразу почему-то вспомнился этот мем)
http://img0.joyreactor.cc/pics/comme...-6-326642.jpeg

Чувак провернул просто неимоверную работу практически полностью в одиночку (с небольшой помощью сообщества), и за это однозначно заслуживает уважения. Как-то не красиво поливать его грязью из-за того, что где-то у него были ошибки или он чего-то не знал, тем более не имея за плечами ни одной подобной работы для сравнения
__________________
Ко мне можно и нужно обращаться на ты)


Последний раз редактировалось caseyryan; 02.03.2016 в 06:11.
Старый 02.03.2016, 12:47
gloomyBrain вне форума Посмотреть профиль Отправить личное сообщение для gloomyBrain Найти все сообщения от gloomyBrain
  № 9  
Ответить с цитированием
gloomyBrain
 
Аватар для gloomyBrain

блогер
Регистрация: Mar 2008
Адрес: РФ, Санкт-Петербург
Сообщений: 2,272
Записей в блоге: 5
Отправить сообщение для gloomyBrain с помощью ICQ Отправить сообщение для gloomyBrain с помощью Skype™
Цитата:
Сообщение от dimarik Посмотреть сообщение
… Попробуйте повращать спрайт с 16к детей. И попробуйте повращять одно дитё из 16к в этом спрайте. Результат впечатляющий. Вращение спрайта вызывает полный переобход и перерендеринг. Вращение дитя незаметно. Это достижение, я щитаю.
Вот есть у нас меши, есть матрица трансформации каждого из них. И есть матрица родительского дисплейного объекта. В общем случае я не знаю иного решения кроме как умножать матрицу каждого ребенка на матрицу родителя.

Слушайте, мне вот интересно, как Вы решаете подобную проблему?
No offence, просто интересно.


PS
Я когда-то давно писал свой дисплей-лист на интрузивных списках, но это позволяет лишь экономить на обходе детей и батчинге, но не на трансформациях.
__________________
...вселенская грусть

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

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

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

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

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


 


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


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