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

Вернуться   Форум Flasher.ru > Блоги > Tails

Рейтинг: 4.25. Голосов: 4.

Сеттер геттер vs прямой доступ

Запись от Tails размещена 18.04.2013 в 22:21

Цель:
В целях удовлетворения любопытства, устроить небольшой тест - сравнение на скорость доступа к переменной через сеттер/геттер и прямой доступ. Очевидно, что сеттер/геттер будет работать медленнее прямого доступа, но насколько? Может, кому то ещё кроме меня будет интересно.

Постановка:
Сперва даём плееру 1 секунду на "разогрев", затем делаем замеры времени на скорость обработки операций инкремента через два разных способа. Сперва через прямой доступ, затем сеттер/геттер. Операция инкремента будет вызывать геттер и сеттер для каждой итераций.

Софт:
Тест проводился в Flash CS5, в версиях флешь плеера 10 и 11.6. Результаты одинаковые. Вывод делался в трейс.

Класс SetterGetter:
Код AS3:
package  {
 
	public class SetterGetter {
 
		private var _i:uint;
 
		public function SetterGetter() {
			// constructor code
		}
 
		public function get i():uint{
			return _i;
		}
		public function set i(value:uint):void{
			_i = value;
		}
 
	}
}
Код класса Direct:
Код AS3:
package  {
 
	public class Direct {
 
		public var i:uint;
 
		public function Direct() {
			// constructor code
 
			i = 0;
		}
 
 
	}
}
Код в файле fla:
Код AS3:
import flash.utils.Timer;
import flash.events.TimerEvent;
 
// Тест на скорость обработки
var timer:Timer			= new Timer(1000, 1);
timer.addEventListener(TimerEvent.TIMER_COMPLETE, onStartTest);
timer.start();
 
const ITERATIONS:uint	= 9999999;
 
var test1:SetterGetter	= new SetterGetter();
var test2:Direct		= new Direct();
var time:Number;
 
 
trace('--- Start Test of ' + ITERATIONS + ' iterations ---');
 
function onStartTest(e:TimerEvent):void{
	var i:uint;
	var result1:Number;
	var result2:Number;
 
	// Direct
	time				= getTimer();
	for(i = 0; i < ITERATIONS; i++){
		test2.i ++;
	}
	result1				= getTimer() - time;
	trace('Direct result: ' + result1 + ' milliseconds');
 
	// Setter getter
	time				= getTimer();
	for(i = 0; i < ITERATIONS; i++){
		test1.i ++;
	}
	result2				= getTimer() - time;
	trace('Setter getter result: ' + result2 + ' milliseconds');
 
	// Total
	trace('Difference to: ' +  result2 / result1);
}
Трейс:
Код:
--- Start Test of 9999999 iterations ---
Direct result: 			335 milliseconds
Setter getter result: 	2301 milliseconds
Difference to: 			6.86865671641791
Результат:
Конечно, 9999999 итераций это очень много. Но всё же, разница скорости доступа на "микро уровне" варьируется в диапазоне от 5.5 - 7.5. В среднем, скорость доступа к переменной через сеттер геттер в 7 раз медленнее прямого доступа.

сеттер геттер vs прямой доступ.rar
Всего комментариев 16

Комментарии

Старый 19.04.2013 11:00 zuxul вне форума
zuxul
Трейсы работают только в дебаге.
Делать тесты производительности в дебажной флешке нельзя. Работает часто совсем не так, как в релизной.
Еще, нужен релизный плеер, чтобы быть совсем честным.
Старый 19.04.2013 14:15 Sintesis вне форума
Sintesis
 
Аватар для Sintesis
В ASC 2.0 появились функции подстановки (inline). Возможно они спасут сеттеры и геттеры, потестировать-бы.
Старый 19.04.2013 14:57 MikroAcse вне форума
MikroAcse
 
Аватар для MikroAcse
Хмм, к чему тесты? Все равно в большинстве случаев без геттеров/сеттеров не обойтись.
Старый 19.04.2013 16:28 in4core вне форума
in4core
 
Аватар для in4core
Цитата:
Хмм, к чему тесты? Все равно в большинстве случаев без геттеров/сеттеров не обойтись.
Обойтись конечно можно, но зачем? Доступ Public нужен только для методов и конструкторов класса, больше нигде он не нужен. public var - моветон ! и баста
Старый 19.04.2013 19:25 etc вне форума
etc
 
Аватар для etc
Не очень понятно, зачем нужно было сравнивать разные инструменты.
Старый 19.04.2013 20:09 MikroAcse вне форума
MikroAcse
 
Аватар для MikroAcse
Цитата:
Обойтись конечно можно, но зачем? Доступ Public нужен только для методов и конструкторов класса, больше нигде он не нужен. public var - моветон ! и баста
Я, конечно, согласен. Но зачем надо было это мне писать?
Старый 19.04.2013 21:08 Tails вне форума
Tails
 
Аватар для Tails
etc,
Всё же эти инструменты очень похожи.

У меня появился такой интерес из-за того, что один класс, реализующий некоторый интерфейс, должен был иметь свойство. Так как в интерфейсе указать переменные нельзя, его пришлось сделать через геттер/сеттер, вот и стало интересно, на сколько это накладнее обычной переменной.
Старый 19.04.2013 23:53 Psycho Tiger вне форума
Psycho Tiger
 
Аватар для Psycho Tiger
Сеттеры и геттеры – это синтаксический сахар. Короче, это – методы.
Насколько поле класса похоже на метод я не знаю.
Цитата:
public var - моветон ! и баста
А какой толк в обёртке get/set, если этот get/set только меняет переменную, не имея дополнительной логики? )

Upd: хотя, наверное я опешил. Это не совсем сахар, но суть ты же.
Старый 01.05.2013 21:08 Azo вне форума
Azo
 
Аватар для Azo
get set нужны порой даже очень.
Тем более что создается set или get не всегда для дублирования имеющихся переменных, но и для создания динамических переменных зависящих от других переменных\методов.

А что касается теста, то что set,get уступают по скорости - говорит лишь об одном : Так уж распределяется память при использовании этих методов. Никто же не знает как себя ведет остальной код, Может быть обращаясь через dirrect , сами dirrectы и быстры, но зато new Object()-у выполняемому в это время повезло меньше. Да и set get это отнюдь не самый прожерливый кодчтобы на нем экономить
Старый 02.05.2013 14:30 Psycho Tiger вне форума
Psycho Tiger
 
Аватар для Psycho Tiger
Можно поподробнее о распределении памяти при get/set вызовах?
Старый 05.05.2013 12:01 Партизан вне форума
Партизан
 
Аватар для Партизан
Tails, как вам идея сравнить JSON с JPEG?
Старый 05.05.2013 12:42 КорДум вне форума
КорДум
 
Аватар для КорДум
Кратко о работе поиска ссылок на основе примера в статье.

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

Далее, ВМ видит, что вызывается какой-то публичный член у этого экземпляра класса. "Очень круто!" — думает она и начинает искать среди публичных членов экземпляра класса нужное свойство или метод.

Если это было просто публичное поле, то вот оно — мы его нашли сразу.

А если это сеттер, который является обычным методом, посыпанным синтаксическим сахарком, то мы пока только нашли ссылку на этот метод. А еще нужно его выполнить. Поэтому ВМ начинает выполнять код в методе. Находит обращение к приватному полю. Но ведь она не знает, что оно приватное, верно? Ищет упоминание об этом поле в локальной области видимости метода. Не находит, переходит в область видимости экземпляра класса. Находит там.

А теперь посмотрите, сколько лишних шагов выполняет ВМ, пока доберется до обычного auto-property акцессора. На больших итерациях время накапливается, хоть и незначительно. В данной ситуации, если не будет использоваться хотя бы одна возможность метода, относительно обычного паблик поля, логично заменить их на паблик поля. Бритва Оккама, не стоит городить что-то ради этого чего-то, а не функциональности, если простым языком.
Старый 05.05.2013 17:49 Tails вне форума
Tails
 
Аватар для Tails
Psycho Tiger,
Цитата:
А какой толк в обёртке get/set, если этот get/set только меняет переменную, не имея дополнительной логики?
Геттер-сеттер выгодно отличается от обычного поля класса тем, что может быть указан в интерфейсе.

Мне вот ещё свойство length у массивов вспомнилось, оно подсвечивается в FD как public var, но может работать и как сеттер, укорачивая длину массива. Это какое-то низкоуровневое отсечение?
Старый 05.05.2013 23:20 Psycho Tiger вне форума
Psycho Tiger
 
Аватар для Psycho Tiger
Цитата:
Геттер-сеттер выгодно отличается от обычного поля класса тем, что может быть указан в интерфейсе.
А ещё переопределен в дочерних классах!
Конечно, я говорю о случае, когда этой функциональности не требуется.

Цитата:
Мне вот ещё свойство length у массивов вспомнилось, оно подсвечивается в FD как public var, но может работать и как сеттер, укорачивая длину массива. Это какое-то низкоуровневое отсечение?
Это может быть ленивое отсечение. Отсечем в момент, когда спросят о чем-то (или оставим данные и выведем первые length, а далее - как-будто и нету). [] – это оператор, но никто не говорит что это "честный" оператор указания на настоящую память =) Где то ведь швыряется OutOfBounds error.
Но это "первые мысли" – однозначно сказать не могу - надо курить тамарин.
Старый 08.05.2013 19:26 strangedk вне форума
strangedk
 
Аватар для strangedk
Я не первый раз встречаю в некоторых проектах приватные переменные в классах, и пустышки сеттер-геттер к ним. Как по мне, это полный бред.

В Value Objects использование setter-getter так же не имеет особой смысловой нагрузки, когда нужно просто запихнуть данные. Исключение может составить установка значения через конструктор, и read-only доступ через геттеры.

Всё упирается в адекватность. Если сеттер с геттером пустые, то кажется проще привести поле класса к типу public. Если же нужно как-то отслеживать, фильтровать или ограничивать доступ, тогда конечно, имеет смысл использовать setter-getter.
Старый 08.05.2013 19:30 СлаваRa вне форума
СлаваRa
 
Аватар для СлаваRa
Цитата:
Если сеттер с геттером пустые, то кажется проще привести поле класса к типу public.
если конечно оно не из-за интерфейса

Цитата:
и read-only доступ через геттеры.
конечно, а запись с диспатчем, нафиг не нужна


Любой подход оправдан, если он применен для решения определенной задачи.
 

 


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


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