Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Разница между "obj['s']" = и "obj.s =" (http://www.flasher.ru/forum/showthread.php?t=159067)

Welcometo 26.06.2011 23:47

Цитата:

Трейсы выдали: 1000, 621, 242, 362 соответственно.
То есть new Object почти вдвое быстрее чем {} ?
А почему тогда рекомендуется использовать {}, как писал udaaff.

wvxvw 27.06.2011 00:03

Смысл не в скорости, т.как по скорости нужно оптимизировать, когда это критично. Смысл в том, что когда вы компилируете X.Y - компилятор проверит, и выдаст ошибку, если у объекта X нет свойства Y. А когда вы X[Y] - это называется reflection - т.е. вы используете возможность среды выполнения найти по заданному строковому ключу свойство объекта. Естесственно, это будет не надежно (т.как вы можете сделать ошибку в имени свойства, т.как кто-то может после компиляции переиначить таблицу символов - место в котором среда выполнения будет искать соответствие ключа и свойства), ну и понятное дело, будет медленнее, т.как, даже не смотря на то, что флешевый компилятор - не оптимизирующий, при создании имен во время компиляции он может использовать более или менее жесткие правила. Менее жесткие правила требуют впоследствие от среды выполнения больше работы для нахождения свойства.

S-ed 27.06.2011 01:45

Код AS3:

obj["2011"] = 50;
obj.2011 = 50; //ну, тут Вы, думаю, поняли...


goodguy 27.06.2011 07:20

Цитата:

Сообщение от wvxvw (Сообщение 1006736)
Смысл не в скорости, т.как по скорости нужно оптимизировать, когда это критично. Смысл в том, что когда вы компилируете X.Y - компилятор проверит, и выдаст ошибку, если у объекта X нет свойства Y. А когда вы X[Y] - это называется reflection - т.е. вы используете возможность среды выполнения найти по заданному строковому ключу свойство объекта. Естесственно, это будет не надежно (т.как вы можете сделать ошибку в имени свойства, т.как кто-то может после компиляции переиначить таблицу символов - место в котором среда выполнения будет искать соответствие ключа и свойства), ну и понятное дело, будет медленнее, т.как, даже не смотря на то, что флешевый компилятор - не оптимизирующий, при создании имен во время компиляции он может использовать более или менее жесткие правила. Менее жесткие правила требуют впоследствие от среды выполнения больше работы для нахождения свойства.

Странно. У меня компилятор не выдает никаких ошибок, даже если я пытаюсь ему подсунуть свойство, отсутствующее в объекте. И если попытаться оттрейсить такое свойство, просто выдаст null, и не более.

gloomyBrain 27.06.2011 11:23

Цитата:

просто выдаст null, и не более
Вы чем компилируете? Если свойство не существует, значит оно undefined, а не null
Код AS3:

var o:Object = { };
trace(o.a);    // undefined
trace(o["a"]); // undefined


goodguy 27.06.2011 11:26

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

wvxvw 27.06.2011 11:41

Ну так это вообще разные вещи... есть доступ к элементам массива или хеш, а есть обращение к свойствам. Когда вы обращаетесь к строковому хешу то, скорее всего, происходит следующее (так это происходит в других языках, как именно это происходит в AS3 - я не знаю, но вряд ли отличается):
Используя простой алгоритм хеширования из строкового ключа создается числовой индекс (обычно 0..2^16) и в массив по этому индексу заносится ссылка на объект, который есть значение пары ключ-значение.
Когда вы используете синтаксис с точкой, то компилятор может быть уверен, что у него есть полная строка, и он может элементарно заменить ее на переход по индексу. Когда вы используете квадратные скобки, то у компилятора такой уверенности быть не может, и он оставит процедуру создания индекса рантайму. Естесственно, что второй вариант будет дольше. Но, опять же, это не доступ к свойству, они просто одинаково записываются в AS3, но свойства - это квалифицированые имена, и они не обязаны вообще привязываться к каким-то строкам, в то время как строковой хеш, естесствено, обязан использовать строки.

alatar 27.06.2011 12:06

Цитата:

Сообщение от goodguy (Сообщение 1006787)
Но суть не в этом, суть в том, что ошибок не выдает на этапе компилирования. Только при попытке дальнейшего обращения к этому свойству.

Потому что объект динамический.

etc 27.06.2011 18:26

Цитата:

Сообщение от udaaff (Сообщение 1006718)
Рекомендуется второй вариант.

Здесь нужно дописать ещё то, что это рекомедуется только в том случае, когда вы этих объектов миллион в секунду создаёте.

S-ed 28.06.2011 02:06

Цитата:

Здесь нужно дописать ещё то, что это рекомедуется только в том случае, когда вы этих объектов миллион в секунду создаёте.
Цитата дня. =)))


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

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