|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Регистрация: Mar 2009
Адрес: Kazakhstan, Almaty
Сообщений: 121
|
Почему время вызова методов так велико?
Есть три примера. В одном - просто идет сложение двух чисел.
Во втором - то же самое сложение, только выполняется при вызове метода sum(); В третьем - происходит вызов пустого метода sum(); Все это дело в цикле i<1,000,000 в первом случае - 85мс. во втором - 370мс. в третьем - 330мс. Так что же такое получается? вызов даже пустого метода выполяется намного медленее, чем сложение чисел типа Number? Что в нем такого сложного, что на его вызов тратится столько времени? з.ы. в другом примере, есть метод который поворачивает одну точку вокруг другой в пространстве - и опять же. 80 из 120 миллисекунд уходит на вызов этого метода, остальные 40 - на три строчки сложений, вычитаний, умножений, делений.... С чего такая ситуция. Мне совершенно непонятно. Есть объяснения? з.ы.ы. Код. 1 пример package { import flash.display.Sprite; import flash.events.Event; import flash.utils.getTimer; public class Main extends Sprite { private var a:Number=156.58465; private var b:Number=53645.5586535; private var c:Number=0; public function Main():void { if (stage) init(); else addEventListener(Event.ADDED_TO_STAGE, init); } private function init(e:Event = null):void { removeEventListener(Event.ADDED_TO_STAGE, init); var st:uint=getTimer(); var i:uint=0; for(i=0;i<1000000;i++){ c=a+b; } var et:uint=getTimer()-st; trace(et); // 85 } private function sum():void{ c=a+b; } } } package { import flash.display.Sprite; import flash.events.Event; import flash.utils.getTimer; public class Main extends Sprite { private var a:Number=156.58465; private var b:Number=53645.5586535; private var c:Number=0; public function Main():void { if (stage) init(); else addEventListener(Event.ADDED_TO_STAGE, init); } private function init(e:Event = null):void { removeEventListener(Event.ADDED_TO_STAGE, init); var st:uint=getTimer(); var i:uint=0; for(i=0;i<1000000;i++){ sum(); } var et:uint=getTimer()-st; trace(et); // 370 } private function sum():void{ c=a+b; } } } package { import flash.display.Sprite; import flash.events.Event; import flash.utils.getTimer; public class Main extends Sprite { private var a:Number=156.58465; private var b:Number=53645.5586535; private var c:Number=0; public function Main():void { if (stage) init(); else addEventListener(Event.ADDED_TO_STAGE, init); } private function init(e:Event = null):void { removeEventListener(Event.ADDED_TO_STAGE, init); var st:uint=getTimer(); var i:uint=0; for(i=0;i<1000000;i++){ sum(); } var et:uint=getTimer()-st; trace(et); // 330 } private function sum():void{ } } }
__________________
заткнись и делай |
|
|||||
Регистрация: Apr 2010
Сообщений: 32
|
Это нормально. Лукапы и все такое. Намного более странно то, что статические функции еще медленнее. Вот тестовый класс:
package { import flash.display.Sprite; import flash.events.Event; import flash.utils.getTimer; public class Test extends Sprite { private var _a:Number=156.58465; private var _b:Number=53645.5586535; private var _c:Number=0; public function Main():void { if (stage) init(); else addEventListener(Event.ADDED_TO_STAGE, do_test); } public function do_test(e:Event = null):void { removeEventListener(Event.ADDED_TO_STAGE, do_test); var st:uint=getTimer(); var i:uint=0; for(i=0;i<8000000;i++){ _c=_a+_b; } var et:uint=getTimer()-st; trace("simple cycle "+et); st=getTimer(); for(i=0;i<8000000;i++){ this.sum_private(_a,_b); } et=getTimer()-st; trace("private function "+et); st=getTimer(); for(i=0;i<8000000;i++){ Test.sum_static(_a,_b); } et=getTimer()-st; trace("static function "+et); } private function sum_private( a : Number, b : Number ):void{ a=a+b; } static public function sum_static( a : Number, b : Number ):void{ a=a+b; } } } Вот это на самом деле страшно. Я ведь до этого времени наивно полагал, что статические функции вызываются быстрее чем нестатические. |
|
|||||
блогер
Регистрация: Jun 2005
Адрес: Господи пожалуйста не Новосибирск
Сообщений: 6,598
Записей в блоге: 17
|
gr_crd, вы видимо из другого языка сюда пришли. Компиляторы под ас3 (mxmlc, например) "туповаты", они даже не складывают числа 5+2 во время компиляции, а считаются в ран-тайме. Конечно, никакие вещи в методах не инлайнятся. К тому же, сложение чисел идёт нативными способами - и оно скорее всего заоптимизировано донельзя в виртуальной машине. Юзер-методы не нативные, поэтому и огребают по полной.
__________________
Тут мужик танцует и поёт про флэш |
Часовой пояс GMT +4, время: 04:57. |
|
« Предыдущая тема | Следующая тема » |
Теги |
время , медленно , метод , скорость , функция |
Опции темы | |
Опции просмотра | |
|
|