Math.floor vs int
И так первая запись в дневнике.
Встречал на многих сайтах статью, где рассказывается об ускорении работы ActionScript 3.0 кода.
Уже закрыл вкладку с одной из этих страниц, не охота искать, изложу один пункт вкрации.
"Используйте int каст, вместо Math.floor это типа быстрее." Вот и я повелся на эту оптимизацию и воткнул в проект эту фичу. И вдруг встретил подводный камень, что-то в проекте начало работать не так.Стал искать причину и вот, что раскопал.Скажу кодом:
trace('//positive number'); var number:Number = 2.3; trace('number = ' + number); trace('int(number) = ' + int(number)); trace('Math.floor(number) = ' + Math.floor(number)); trace(' '); number = 2.5; trace('number = ' + number); trace('int(number) = ' + int(number)); trace('Math.floor(number) = ' + Math.floor(number)); trace(' '); number = 2.7; trace('number = ' + number); trace('int(number) = ' + int(number)); trace('Math.floor(number) = ' + Math.floor(number)); trace(' '); trace('//negative number'); number = -2.3; trace('number = ' + number); trace('int(number) = ' + int(number)); trace('Math.floor(number) = ' + Math.floor(number)); trace(' '); number = -2.5; trace('number = ' + number); trace('int(number) = ' + int(number)); trace('Math.floor(number) = ' + Math.floor(number)); trace(' '); number = -2.7; trace('number = ' + number); trace('int(number) = ' + int(number)); trace('Math.floor(number) = ' + Math.floor(number)); trace(' ');
Что показал trace
Код:
//positive number number = 2.3 int(number) = 2 Math.floor(number) = 2 number = 2.5 int(number) = 2 Math.floor(number) = 2 number = 2.7 int(number) = 2 Math.floor(number) = 2 //negative number number = -2.3 int(number) = -2 Math.floor(number) = -3 number = -2.5 int(number) = -2 Math.floor(number) = -3 number = -2.7 int(number) = -2 Math.floor(number) = -3
Из этого всего можно изложить следующее.
1) когда число number положительное int и Math.floor округляют в меньшую сторону.
2) когда число number отрицательное int и
Math.floor округляют уже по-разному int в большую, а Math.floor соответственно в меньшую
Из всего этого следует вывод, производительность увеличивается, не вопрос, а вот округление подводит.
Решение этого вопроса
//problem-solving trace('//problem-solving if you want to less'); trace('number = ' + number); if (number < 0) { trace('int(number) = ' + int(number)); trace('-Math.floor(-number) = ' + -Math.floor(-number)); }
Код:
//problem-solving if you want to less number = -2.7 int(number) = -2 -Math.floor(-number) = -2
Всего комментариев 8
Комментарии
02.12.2008 03:20 | |
По докам об оптимизации кода АS3 писалось такое, на os.flash...трампарам (там ещё пчела всерху летает, блин, не пойму, зачем там пчела).
Может это сайт, выбшего пчеловода? |
16.02.2009 22:25 | |
Запись от Xero201 размещена 12.01.2010 в 14:07 | |
[QUOTE]Котяра предложил верное решение проблемы.[/QUOTE]
Котяра предложил переводить отрицательное число в по-ложительное, применять int и переводить обратно в отрица-тельное. Но ведь это переливание из пустого в порожнее т.к. int работает для положительных чисел как floor, только потому, что для них откидывание дробной части равносильно округлению в меньшую сторону, в отличии от отрицательных (о чем и говорил [B][I]ramshteks[/I][/B]). Разницы между -int(-x) и int(x) - вообще нет. x=-1.7//-1 а должно быть -2 Т.е. хотя задача заменить floor на int, делать это можно только для неотрицательных чисел Другой вопрос, не получится ли так, что проверка числа на знак + работа int() в суме будет дольше, чем сразу использование floor? Оказывается нет [AS3]var d:int = 10000; var number_less:int; var number:Number; var t1:uint=getTimer(); for (number=0; number<d;number+=0.1){ number_less = (number>0)?int(number):Math.floor(number); } var t2:int=getTimer(); for (number=-d; number<0;number+=0.1){ number_less = Math.floor(number); } var t3:int=getTimer(); trace(t2-t1);//2 trace(t3-t2);//20[/AS3] уф, вот) |
|
Обновил(-а) Xero201 12.01.2010 в 14:16
|
Запись от Xero201 размещена 13.01.2010 в 15:35 | |
вот это другое дело! Теперь верю)))
|
Последние записи от _Smirnoff
- Память, утечки, профилирование, Garbage Collector (12.01.2010)
- Асинхронный wordWrap (06.03.2009)
- Преобразование трех циклов в один (11.01.2009)
- Совершенный код (15.12.2008)
- Math.floor vs int (15.11.2008)