![]() |
|
||||||||||
|
|
|
|||||
|
Регистрация: Mar 2010
Сообщений: 137
|
Вопрос такой...
Пусть у нас есть класс, который реализует расчёт каких-нибудь математических (геометрических) функций. Например, вектор... В какой-то из февральских тем я писал, что имеет смысл проводить кэширование, например, длины вектора. Пересчитывать её только в случаи изменения координат (причём - этого я тогда не писал - при повороте длину тоже можно не пересчитывать). С тех пор добавилось ещё несколько переменных, сопряжённых с необходимостью хранения вспомогательных значений в классе-векторе (и не только в нём). И возникли смутные сомнения по поводу стиля... Сейчас кэширование реализую следующим образом: 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; } Как бы вы посоветовали правильно организовать указанную вещь с точки зрения стиля? И есть ли некий стандарт, следуя которому обычно оформляются подобные штуки? Буду благодарен за ответы! |
|
|||||
|
Не понимаю, как себя оправдывает подобный механизм. Дайте ссылку на "февральскую тему". Если у вас длина вектора зависит от координат, то и проверять необходимость ее пересчета следует в set-методах координат.
|
|
|||||
|
Регистрация: Mar 2010
Сообщений: 137
|
|
|
|||||
|
Регистрация: Oct 2009
Адрес: x=9;y=9;z=1;
Сообщений: 22
|
Помоему кеш вас не должен волновать, это должно быть внутреней реализацией в классе, я бы это реализовал бы примерно так.
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. |
|
|||||
|
Не, в GUI-фреймворках такой подход на полную используется
А здесь не факт. Стоимость 2-х строчек вычислений может быть меньше затрат на вызов 1-го метода. Вы производительность то тестировали? Но, если стиль беспокоит - поробуйте посмотреть на цикл валидации компонентов во Flex/AsWing(хотя в полседнем он кривой и работает также криво) P.S. Если хотите реальный прирост - избавтесь от вызовов методов Math, где это возможно - условная логика, как не странно, работает быстрее: Можно написать так: Все квадратны - заменить на x * x, единственное взятие корня Вы не сможете внятно ускорить без прямого обращения к памяти (что только в алхимии/haXe) или без обработки каким-нть "аппаратом" скомпиленного кода. P.S 2. Обычно советуют наоборот - оптимизировать на высоком уровне - что Вы и пытаетесь делать - но здесь, ИМХО, не тот случай (пока тесты производительности не докажут обратное) Последний раз редактировалось expl; 15.03.2011 в 22:52. |
|
|||||
|
Регистрация: Mar 2010
Сообщений: 137
|
vitalik14, если вы предлагаете ввести некую переменную для кеширования (абстрактную, логически не зависящую от конкретного кэшируемого значения), то да, я думал по этому поводу. В более общем случаи.
Была идея ввести статический стек, которым могли бы использовать все классы для кеширования. Но потом понял что это плохо. Код превартился бы в кашу. Ваш код, кстати, какой-то очень странный. Я вообще не понял вашего условия пересчёта значения. И на счёт внутренней реализации не понял. Чего это не должен волновать? Я же класс пишу, верно? И мне париться… Или виртуальная машина умеет делать это сама? Добавлено через 7 минут expl, на счёт Math целиком согласен. Тот код я писал в качестве критики на класс, написанный другим человеком, и хотел показать идейное преимущество. А вот прирост... Тестировать пока не тестировал, но, как мне кажется, возможность не считать корень и два умножения много раз и с добавлением вместо этого одной лишней проверки даст хороший прирост. Могу сделать тесты, проверить. Не очень понял по поводу метода. Вы имеете в виду, что вычисления надо делать не в самом классе? |
|
|||||
|
Регистрация: Oct 2009
Адрес: x=9;y=9;z=1;
Сообщений: 22
|
Цитата:
var кеш:Point=new Point(4,5); var вычисленное значение:Point=new Point(5,4); if(кеш!=вычисленное_значение)//изменились ли координаты? {//вычисляем значение кеш=вычисленное_значение;//(если изменились координаты копируем значение в кеш) } trace(кеш); //в любом случае равны. Цитата:
Последний раз редактировалось vitalik14; 16.03.2011 в 00:32. |
|
|||||
|
Цитата:
|
|
|||||
|
Регистрация: Mar 2010
Сообщений: 137
|
А всё равно надо вызывать геттер. Это ж всё-таки хорошее ООП с хорошей инкапсуляцией, верно?
К тому же, в С++ подобный код выстроится инлайновым, если правильно настроить. А пишу с прицелом на порт... Кстати, во Flash нет аналога инлайна? Или макросы какие-нибудь? |
|
|||||
|
инлайна нет...посмотрите в сторону haxe. можно попробовать на нем написать статик класс для математики и скомпелить swc . хотя в сети вроде есть несколько реализаций "быстрой математики".
__________________
http://cleptoman.free-lance.ru achivements: дважды благословлен на воровство. осеяный благодатью |
![]() |
![]() |
Часовой пояс GMT +4, время: 03:26. |
|
|
« Предыдущая тема | Следующая тема » |
| Теги |
| быстродействие , кэширование , стиль |
|
|