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

Вернуться   Форум Flasher.ru > Блоги > _Smirnoff

Оценить эту запись

Math.floor vs int

Запись от _Smirnoff размещена 15.11.2008 в 20:43
Обновил(-а) _Smirnoff 15.11.2008 в 20:47

И так первая запись в дневнике.
Встречал на многих сайтах статью, где рассказывается об ускорении работы ActionScript 3.0 кода.
Уже закрыл вкладку с одной из этих страниц, не охота искать, изложу один пункт вкрации.
"Используйте int каст, вместо Math.floor это типа быстрее." Вот и я повелся на эту оптимизацию и воткнул в проект эту фичу. И вдруг встретил подводный камень, что-то в проекте начало работать не так.Стал искать причину и вот, что раскопал.Скажу кодом:

Код AS3:
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 соответственно в меньшую

Из всего этого следует вывод, производительность увеличивается, не вопрос, а вот округление подводит.

Решение этого вопроса

Код AS3:
//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

Комментарии

Старый 22.11.2008 20:45 ramshteks вне форума
ramshteks
 
Аватар для ramshteks
ничего впринципе удивительного, суть то разная, один округляет а другой отсекает дробную часть, так что решение есть, можно поставить условие, вопрос только в том появится ли после этого условия существенный прирост производительности.

Ты вот напиши функцию округления на основе каста и проведи тесты по скорости, вот тут то и повсомтрим)
Старый 02.12.2008 03:20 Molecula вне форума
Molecula
 
Аватар для Molecula
По докам об оптимизации кода АS3 писалось такое, на os.flash...трампарам (там ещё пчела всерху летает, блин, не пойму, зачем там пчела).

Может это сайт, выбшего пчеловода?
Старый 16.02.2009 22:25 Котяра вне форума
Котяра
 
Аватар для Котяра
ну на крайняк делаем так

Код AS1/AS2:
var roundX=x<0?-int(-x):int(x);
тесты:
x=1.7 -> 1
x=1.2 -> 1
x=-1.7 -> -int(1.7)=-1
x=-1.2 -> -int(1.2)=-1
Старый Запись от Xero201 размещена 12.01.2010 в 03:18
Xero201

Что-то не так

Суть темы – замена [B]Math.floor[/B] на [B]int[/B] для повышения производительности, потому что int отбрасывает дробную часть без всякого анализа.
Для отрицательных чисел это не годится. Вывод - сделать так, чтобы еще и Math.floor стал работать [COLOR="Red"]не[/COLOR]правильно (-Math.floor(-number)). Что за бред?)
Ведь задача не заставить выводить их одинаковый результат, а заменить floor на int, правильно? Т.е решение должно быть типо
[AS3]var number_less:int = (number>0)?int(number):Math.floor(number);[/AS3]
Но вот Котяра предлагает:
[QUOTE][AS3]var roundX=x<0?-int(-x):int(x);[/AS3][/QUOTE]
это вообще к чему?!
Ребята, объясните пожалуйста в чем дело
Старый 12.01.2010 09:49 _Smirnoff вне форума
_Smirnoff
 
Аватар для _Smirnoff
Цитата:
Ведь задача не заставить выводить их одинаковый результат, а заменить floor на int, правильно? Т.е решение должно быть типо
Код AS3:
var number_less:int = (number>0)?int(number):Math.floor(number);
Противоречите самому себе. Обратите внимание на Вашу строку

Код AS3:
var number_less:int = (number>0)?int(number):Math.floor(number);
Хотя пишите
Цитата:
а заменить floor на int
Что касается,
Цитата:
Код AS3:
-Math.floor(-number))
Что за бред?
Это бред, было написано не подумавши.

Цитата:
Но вот Котяра предлагает:
Код AS3:
var roundX=x<0?-int(-x):int(x);
это вообще к чему?!
Котяра предложил верное решение проблемы.
Старый Запись от Xero201 размещена 12.01.2010 в 14:07
Xero201
[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
Старый 13.01.2010 10:43 Котяра вне форума
Котяра
 
Аватар для Котяра
предложу еще формулу)
Код AS3:
var n:Number=-2.1;
var f:int = Math.floor(n);
var i:int = n>0?n:int(n)>n ? n-1:n;
 
trace("flor:"+f); //-3
trace("int:"+i);//-3
Код AS3:
// Тест по времени, для положительных и отрицательных
var d:int = 100000;
var number_less:int;
var n:Number;
 
var t1:int=getTimer();
for (n=-d; n<d;n+=0.1){
	number_less = n>0?n:int(n)>n ? n-1:n;
}
 
var t2:int=getTimer();
for (n=-d; n<d;n+=0.1){
	number_less = n>0?n:Math.floor(n);
}
 
var t3:int=getTimer();
for (n=-d; n<d;n+=0.1){
	number_less = Math.floor(n);
}
var t4:int=getTimer();
 
trace(t2-t1);//41
trace(t3-t2);//200
trace(t4-t3);//350
// разница почти в 10 раз!!!
Старый Запись от Xero201 размещена 13.01.2010 в 15:35
Xero201
вот это другое дело! Теперь верю)))
 

 


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


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