AS3: uint на много медленнее, чем Number

51 views
Skip to first unread message

Valentin Simonov

unread,
Jan 11, 2008, 4:29:00 AM1/11/08
to ruF...@googlegroups.com
Hi.

Наткнулся тут на http://www.gskinner.com/blog/archives/2006/06/types_in_as3_in.html
И действительно, uint в циклах просто ужасно отстает по производительности.

var n = getTimer()
for (var i:Number = 0; i < 16777215; i++){}
trace("Number", getTimer()-n)

n = getTimer()
for (var j:int = 0; j < 16777215; j++){}
trace("int", getTimer()-n)

n = getTimer()
for (var k:uint = 0; k < 16777215; k++){}
trace("uint", getTimer()-n)

у меня трейсит

Number 85
int 78
uint 239

а я как дурак в своём флексовом проекте везде uint понавставлял
...

Denis Kolyako

unread,
Jan 11, 2008, 4:35:40 AM1/11/08
to Valentin Simonov
Здравствуйте, Valentin.

> а я как дурак в своём флексовом проекте везде uint понавставлял

var n = getTimer()
for (var i:Number = 0; i < 16777215; i+=1){}
trace("Number", getTimer()-n) // 166

n = getTimer()
for (var j:int = 0; j < 16777215; j+=1){}
trace("int", getTimer()-n) // 91

n = getTimer()
for (var k:uint = 0; k < 16777215; k+=1){}
trace("uint", getTimer()-n) // 91

Денис Коляко
______________________________________________________________________
e...@timezero.ru | http://etcs.ru/ | http://www.timezero.ru/

Racer

unread,
Jan 11, 2008, 5:09:28 AM1/11/08
to ruFlash
ВАУ.

++ :
Number 84
int 73
uint 234

+=1
Number 82
int 58
uint 49

НО ПОЗВОЛЬТЕ! Это же ужастно!

Nox Noctis

unread,
Jan 11, 2008, 5:18:43 AM1/11/08
to ruF...@googlegroups.com
> ++ :
> Number 84
> int 73
> uint 234
>
> +=1
> Number 82
> int 58
> uint 49

думаю, все дело в том, какой тип имеет единица.

в случае ++ мы складываем два значения одного типа (происходит
дублирование элемента в стеке).

а в случае с += мы складываем исходный тип с константой типа int.

import flash.utils.getTimer;

var a:uint = 0;
var b:uint = 1;

var s:uint = getTimer();
for (var i:int = 0; i<0xFFFFFF; i+=1) {
a += b;
}
trace(getTimer()-s); // 215


var c:uint = 0;
var d:int = 1;

s = getTimer();
for (i = 0; i<0xFFFFFF; i+=1) {
c += d;
}
trace(getTimer()-s); // 70


--
Michael Antipin
______________________________________________________________________
n...@design.ru | http://www.artlebedev.ru | http://www.noregret.org

Valentin Simonov

unread,
Jan 11, 2008, 5:34:13 AM1/11/08
to ruF...@googlegroups.com
Hi.

Занятно, я не знал.
Век живи, век учись (8

Racer

unread,
Jan 11, 2008, 5:39:23 AM1/11/08
to ruFlash
Чисто из любопытства:

import flash.utils.getTimer;

var one_n:Number=1;
var one_i:int=1;
var one_u:uint=1;

var n = getTimer()
for (var i:Number = 0; i < 16777215; i+=one_n){}
trace("Number", getTimer()-n) //80

n = getTimer()
for (var j:int = 0; j < 16777215; j+=one_i){}
trace("int", getTimer()-n) //57

n = getTimer()
for (var k:uint = 0; k < 16777215; k+=one_u){}
trace("uint", getTimer()-n) //228

В какой бы цикл не подставили one_u получаются астрономические цифры.
Неее... uint только для обозначения констант клавиш, цветов и т.п.

Pirrest

unread,
Jan 11, 2008, 1:53:54 PM1/11/08
to ruF...@googlegroups.com
Еще инетересно то, что в ActionScript 2.0 такой код:
var s:Number = getTimer();
for (var i:Number = 0; i<0xFFFFFF; i++) {}
trace(getTimer()-s);

не доживает до трейса, т.к. выполняется больше 15-ти секунд :)
Reply all
Reply to author
Forward
0 new messages