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

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

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

Регистрация: Mar 2010
Сообщений: 137
По умолчанию Кеширование переменных

Вопрос такой...

Пусть у нас есть класс, который реализует расчёт каких-нибудь математических (геометрических) функций. Например, вектор...

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

С тех пор добавилось ещё несколько переменных, сопряжённых с необходимостью хранения вспомогательных значений в классе-векторе (и не только в нём). И возникли смутные сомнения по поводу стиля...

Сейчас кэширование реализую следующим образом:

Код AS3:
		var __cashingVariable:someType;
		var __cashingVariableUpdateNeed:Boolean;
 
		public function get CashedVaribleGetter()
		{
			if (__cashingVariableUpdateNeed)
			{
				// Make some actions to get new value of cashing variable
 
				__cashingVariableUpdateNeed = false;
			}
 
			return __cashingVariable;
		}
При этом переменная __cashingVariableUpdateNeed переводиться в состоянии true в момент изменения переменных, от которых данное значение зависит (в случаи с длиной вектора - координат).

Как бы вы посоветовали правильно организовать указанную вещь с точки зрения стиля? И есть ли некий стандарт, следуя которому обычно оформляются подобные штуки?

Буду благодарен за ответы!

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

Регистрация: Oct 2010
Сообщений: 1,049
Отправить сообщение для bav с помощью ICQ
Не понимаю, как себя оправдывает подобный механизм. Дайте ссылку на "февральскую тему". Если у вас длина вектора зависит от координат, то и проверять необходимость ее пересчета следует в set-методах координат.

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

Регистрация: Mar 2010
Сообщений: 137
Ссылочка на тему

Старый 15.03.2011, 22:36
vitalik14 вне форума Посмотреть профиль Отправить личное сообщение для vitalik14 Найти все сообщения от vitalik14
  № 4  
Ответить с цитированием
vitalik14

Регистрация: Oct 2009
Адрес: x=9;y=9;z=1;
Сообщений: 22
Помоему кеш вас не должен волновать, это должно быть внутреней реализацией в классе, я бы это реализовал бы примерно так.
Код AS3:
private var _cash:someType;
private var _calculationVectorLength:someType;
 
public function get vectorLength ():someType{
    if(_calculationVectorLength!=_cash){
    //расчет длины вектора
_cash=_calculationVectorLength;
}
return _cash;
}
//еще надо  _cash инициализировать в конструкторе чтобы компилятор не кричал бы о null;


Последний раз редактировалось vitalik14; 15.03.2011 в 22:39.
Старый 15.03.2011, 22:43
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 5  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Не, в GUI-фреймворках такой подход на полную используется

А здесь не факт. Стоимость 2-х строчек вычислений может быть меньше затрат на вызов 1-го метода.
Вы производительность то тестировали?
Но, если стиль беспокоит - поробуйте посмотреть на цикл валидации компонентов во Flex/AsWing(хотя в полседнем он кривой и работает также криво)

P.S. Если хотите реальный прирост - избавтесь от вызовов методов Math, где это возможно - условная логика, как не странно, работает быстрее:
Код AS3:
if(Math.abs(_x) < 0.00000001) _x = 0;
if(Math.abs(_y) < 0.00000001) _y = 0;
Можно написать так:
Код AS3:
if((_x > 0 ? x : -x) < 0.00000001) _x = 0;
if((_y > 0 ? y : -y) < 0.00000001) _y = 0;
Все квадратны - заменить на x * x, единственное взятие корня Вы не сможете внятно ускорить без прямого обращения к памяти (что только в алхимии/haXe) или без обработки каким-нть "аппаратом" скомпиленного кода.

P.S 2. Обычно советуют наоборот - оптимизировать на высоком уровне - что Вы и пытаетесь делать - но здесь, ИМХО, не тот случай (пока тесты производительности не докажут обратное)


Последний раз редактировалось expl; 15.03.2011 в 22:52.
Старый 15.03.2011, 22:51
semenyakinVS вне форума Посмотреть профиль Отправить личное сообщение для semenyakinVS Найти все сообщения от semenyakinVS
  № 6  
Ответить с цитированием
semenyakinVS

Регистрация: Mar 2010
Сообщений: 137
vitalik14, если вы предлагаете ввести некую переменную для кеширования (абстрактную, логически не зависящую от конкретного кэшируемого значения), то да, я думал по этому поводу. В более общем случаи.

Была идея ввести статический стек, которым могли бы использовать все классы для кеширования. Но потом понял что это плохо. Код превартился бы в кашу.

Ваш код, кстати, какой-то очень странный. Я вообще не понял вашего условия пересчёта значения.

И на счёт внутренней реализации не понял. Чего это не должен волновать? Я же класс пишу, верно? И мне париться…
Или виртуальная машина умеет делать это сама?

Добавлено через 7 минут
expl, на счёт Math целиком согласен.

Тот код я писал в качестве критики на класс, написанный другим человеком, и хотел показать идейное преимущество.

А вот прирост... Тестировать пока не тестировал, но, как мне кажется, возможность не считать корень и два умножения много раз и с добавлением вместо этого одной лишней проверки даст хороший прирост. Могу сделать тесты, проверить.

Не очень понял по поводу метода. Вы имеете в виду, что вычисления надо делать не в самом классе?

Старый 16.03.2011, 00:27
vitalik14 вне форума Посмотреть профиль Отправить личное сообщение для vitalik14 Найти все сообщения от vitalik14
  № 7  
Ответить с цитированием
vitalik14

Регистрация: Oct 2009
Адрес: x=9;y=9;z=1;
Сообщений: 22
Цитата:
В какой-то из февральских тем я писал, что имеет смысл проводить кэширование, например, длины вектора. Пересчитывать её только в случаи изменения координат
..................................
Ваш код, кстати, какой-то очень странный. Я вообще не понял вашего условия пересчёта значения.
конечно же, все абстрактно), а так

Код AS3:
var кеш:Point=new Point(4,5);
var вычисленное значение:Point=new Point(5,4);
 
if(кеш!=вычисленное_значение)//изменились ли координаты?
{//вычисляем значение
кеш=вычисленное_значение;//(если изменились координаты копируем значение в кеш) 
}
trace(кеш); //в любом случае равны.
Цитата:
И на счёт внутренней реализации не понял. Чего это не должен волновать? Я же класс пишу, верно? И мне париться…
Или виртуальная машина умеет делать это сама?
объявление переменной var без индефикатора доступа(по умолчанию external) видна всему пакету.


Последний раз редактировалось vitalik14; 16.03.2011 в 00:32.
Старый 16.03.2011, 02:15
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 8  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Цитата:
Не очень понял по поводу метода. Вы имеете в виду, что вычисления надо делать не в самом классе?
Это просто к тому, что вспомогательные операции по кешированию, если они вызывают методы - могут съесть весь прирост

Старый 16.03.2011, 19:29
semenyakinVS вне форума Посмотреть профиль Отправить личное сообщение для semenyakinVS Найти все сообщения от semenyakinVS
  № 9  
Ответить с цитированием
semenyakinVS

Регистрация: Mar 2010
Сообщений: 137
А всё равно надо вызывать геттер. Это ж всё-таки хорошее ООП с хорошей инкапсуляцией, верно?

К тому же, в С++ подобный код выстроится инлайновым, если правильно настроить. А пишу с прицелом на порт...

Кстати, во Flash нет аналога инлайна? Или макросы какие-нибудь?

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

блогер
Регистрация: Mar 2007
Сообщений: 1,291
Записей в блоге: 5
Отправить сообщение для cleptoman с помощью ICQ
инлайна нет...посмотрите в сторону haxe. можно попробовать на нем написать статик класс для математики и скомпелить swc . хотя в сети вроде есть несколько реализаций "быстрой математики".
__________________
http://cleptoman.free-lance.ru
achivements: дважды благословлен на воровство. осеяный благодатью

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

Теги
быстродействие , кэширование , стиль

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

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


 


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


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