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

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 21.05.2010, 17:00
gr_crd вне форума Посмотреть профиль Отправить личное сообщение для gr_crd Посетить домашнюю страницу gr_crd Найти все сообщения от gr_crd
  № 1  
Ответить с цитированием
gr_crd
 
Аватар для gr_crd

Регистрация: Mar 2009
Адрес: Kazakhstan, Almaty
Сообщений: 121
Question Почему время вызова методов так велико?

Есть три примера. В одном - просто идет сложение двух чисел.
Во втором - то же самое сложение, только выполняется при вызове метода sum();
В третьем - происходит вызов пустого метода sum();

Все это дело в цикле i<1,000,000
в первом случае - 85мс.
во втором - 370мс.
в третьем - 330мс.

Так что же такое получается? вызов даже пустого метода выполяется намного медленее, чем сложение чисел типа Number? Что в нем такого сложного, что на его вызов тратится столько времени?

з.ы. в другом примере, есть метод который поворачивает одну точку вокруг другой в пространстве - и опять же. 80 из 120 миллисекунд уходит на вызов этого метода, остальные 40 - на три строчки сложений, вычитаний, умножений, делений....

С чего такая ситуция. Мне совершенно непонятно. Есть объяснения?

з.ы.ы. Код.

1 пример
Код AS3:
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;
		}
 
	}
 
}
2-ой пример

Код AS3:
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;
		}
 
	}
 
}
3-ий пример

Код AS3:
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{
 
		}
 
	}
 
}
__________________
заткнись и делай

Старый 21.05.2010, 17:45
shootkin вне форума Посмотреть профиль Отправить личное сообщение для shootkin Найти все сообщения от shootkin
  № 2  
Ответить с цитированием
shootkin

Регистрация: Apr 2010
Сообщений: 32
Это нормально. Лукапы и все такое. Намного более странно то, что статические функции еще медленнее. Вот тестовый класс:
Код AS3:
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;
		}
	}
}
И его результат:
Код:
simple cycle 27
private function 394
static function 670
Вот это на самом деле страшно. Я ведь до этого времени наивно полагал, что статические функции вызываются быстрее чем нестатические.

Старый 21.05.2010, 18:52
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 3  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Господи пожалуйста не Новосибирск
Сообщений: 6,598
Записей в блоге: 17
gr_crd, вы видимо из другого языка сюда пришли. Компиляторы под ас3 (mxmlc, например) "туповаты", они даже не складывают числа 5+2 во время компиляции, а считаются в ран-тайме. Конечно, никакие вещи в методах не инлайнятся. К тому же, сложение чисел идёт нативными способами - и оно скорее всего заоптимизировано донельзя в виртуальной машине. Юзер-методы не нативные, поэтому и огребают по полной.

Создать новую тему Ответ Часовой пояс GMT +4, время: 20:53.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Теги
время , медленно , метод , скорость , функция
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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