Необъяснимые memory allocation на строгих проверках.
Недавно обнаружил забавную особенность. Если использовать строгую проверку (stricte quals "===" или "!==") при сравнении двух Number, и если один из операндов не является целым числом, то происходит выделение памяти (memory allocation), примерно 8 байтов на одну проверку. Строгое сравнение остальных типов данных не вызывает лишнее выделение памяти.
GC лишнюю память, конечно, очищает, но на выделение и очистку уходит драгоценное время.
В байткоде обычное и строгое сравнение различаются одним опкодом: equals (00ABh) заменяется на strictequals (00ACh).
Тестировал на mxmlc из 4.6.0 FlexSDK и ASC 2.0 из 3.7 AIRSDK компиляторах с опцией -swf-version 20.
Код теста.
package { import flash.display.Sprite; import flash.events.Event; public class MemoryAllocationOnStrictEqualsTest extends Sprite { public function MemoryAllocationOnStrictEqualsTest() { super(); super.addEventListener(flash.events.Event.ENTER_FRAME, this.handler_enterFrame); } private function handler_enterFrame(event:Event):void { //var a:Number = 1.0; // нет выделения памяти var a:Number = 1.1; // есть выделение памяти for (var i:uint; i < 5000; ++i) if (a === 2.0) {} } } }
Всего комментариев 4
Комментарии
05.08.2013 19:26 | |
Интересненько, спасибо.
|
06.08.2013 10:44 | |
8 килобайт - весьма жирно.
Что-ж там такое происходит? |
07.08.2013 10:33 | |
07.08.2013 13:04 | |
FlashRus, это моя неприятная ошибка на порядок. 8 байтов же!
|
Последние записи от dimarik
- Memory allocation на Vector.<IInterface> (07.05.2015)
- [Starling] Тормози меня плавно! (28.10.2014)
- [Starling идиотизмы] Об интерактивных событиях (02.10.2014)
- О типах исключений. (23.04.2014)
- Немного о Vector и ByteArray (28.03.2014)