Flash Ripper RSS Readers

Сколько памяти экономит использование типа int вместо Number в AS3

Adobe настойчиво рекомедует использовать тип переменной int вместо Number, если можно обойтись целой частью числа. А еще лучше — тип uint, если можно пренебречь его знаком.

Я решил проверить, наколько экономнее использование типа int вместо Number, поскольку встречаются проекты, где чисел много, до пары миллионов.

Задался целью узнать, сколько памяти можно сэкономить, например, на миллионе объектов типа PointVO. Это точка с координатами x и y. В одном тесте я задал тип переменных x и y как int, а в другом — как Number (о третьем тесте ниже).

В моих тестах использование типа int вместо Number показало уменьшение расхода оперативной памяти приблизительно на 15% при том же времени выполнения.

Подробности испытания — дальше.

Как проводилось тестирование


Один тест:
В цикле создается миллион экземпляров PointVO(x,y) и они сохраняются в массиве. Эта итерация производится 10 раз подряд для получения средних значений.

Было проведено три таких теста: 1) Для PointVO с координатами общего типа Number; 2) Для PointVO с координатами целого типа int; 3) Для PointVO с координатами целого беззнакового типа uint;

Результаты эксперимента (средние значения по 10 прогонам)


Тип Number:
Расход памяти: 53876326 байт (53 Мб)
Time average: 1243 мсек (1,2 сек)

Тип int:
Расход памяти: 45490176 байт (45 Мб)
Time average: 1226 мсек (1,2 сек)

Тип uint:
Расход памяти: 45788774 байт (45 Мб)
Time average: 1222 мсек (1,2 сек)

Вывод: int экономит память при сравнении с Number, не отбирая времени.

Исходный код тестов


Класс PointVO:
package
{
public class PointVO
{
public var x:Number; //(int, uint)
public var y:Number; //(int, uint)

public static var pointsCount:uint = 0;

public function PointVO(x:Number, y:Number)
{
this.x = x;
this.y = y;
pointsCount++;
}
}
}

Тестовый скрипт:

import classes.PointVO;
var startTime:uint;
var memory:uint;
var time:uint;
var memoryAverage:uint;
var timeAverage:uint;
var cycles:uint = 10;
var pCount:uint = 1000000;
var i:uint;
var j:uint;
var pArray:Array;
var randCoord:Number;
for(j; j < 10; j++)
{
startTime = getTimer();
pArray = new Array();
for(i=0; i {
randCoord = Math.random() * 10000000 / 10000;
pArray[i] = new PointVO(randCoord, randCoord);
}
memory = System.totalMemory;
time = getTimer() - startTime;
memoryAverage += memory;
timeAverage += time;
trace("Memory: " + memory);
trace("Time: " + time);
}
trace("Memory average: " + Math.round(memoryAverage / cycles));
trace("Time average: " + Math.round(timeAverage / cycles));

Меня смущает то, что uint расходует памяти практически столько же, сколько int, хотя Adobe пишет, что должно быть меньше. Может, я где-то ошибся?

Писал Rost, 31 Октябрь 2007 16:28

Найдены баги:

uint это тот же самый int, только в нем есть еще один дополнительный бит для хранения знака.

Garbage Collector - 31 Октябрь 2007 17:39

uint это тот же самый int, только в нем есть еще один дополнительный бит для хранения знака.
в uint'е его как раз и не должно быть, по идее он отдан для хранения бОльших положительных значений :)

т.е. в памяти занимает битов они одинаково, но диапазоны способны хранить разные...

Pietrovich - 31 Октябрь 2007 17:51

А теперь для пущего эффекта стоит выбросить класс
PointVO и заменить его 2 переменными (+ 1 глобальная для postCount) :)
Вот где будет и скорость и памяти хоть отбавляй :)

Vadim Voituk - 31 Октябрь 2007 17:52

2 Vadim Voituk:
Ну, тогда можно, с тем же успехом, советовать писать в байт-коде...

chrm - 31 Октябрь 2007 18:03

2 chrm
Не в этом дело. Просто без объектов чистота эксперимента будет выше.
2 all
Чуваки из группы Papervision3D советовали отказаться от uint в пользу int, где это возможно т.к. скорость работы с int вышче, чем с uint. Я им верю. :)

a_[w] - 31 Октябрь 2007 18:26

а ты реальни пишешь приложения в которых 1000000 объектов используется?..

Moulin Cook - 31 Октябрь 2007 20:31

2 Garbage Collector: uint это тот же самый int, только в нем есть еще один дополнительный бит для хранения знака.

Секундочку. Всё совсем наоборот.
uint - unsigned integer - от 0 до 4294967295
int - integer - от -2147483648 до 2147483647

А бит совсем не дополнительный - их всего 32 и из них один как раз и используется для хранения знака, а именно - крайний левый. Это ж во всех (нормальных) языках так.

Заодно про нумбер - от 4.9406564584124654e-324 до 1.79769313486231e+308
число с плавающей точкой - занимает до 53 бит (кстати странно, почему не кратно 8).

Всегда и везде было производительнее работать с целыми числами чем с плавающей точкой. Кстати, тесты на это дело народ уже проводил и совсем недавно: http://osflash.org/as3_speed_optimizations

Racer - 31 Октябрь 2007 21:30

Помню в Alpha был еще класс StringBuilder который работал быстрее с изменяемыми строками. Увы его убрали..

Nirth - 31 Октябрь 2007 21:31

Не совсем в тему, но все равно про тип uint.
Недавно столкнулся с такой штукой:
for(var i:uint = 3;i >= 0;i--) trace(i);
Все выглядит логично... Но на самом деле этот цикл зацикливается...
Я так понимаю, что после того как i становится равным 0 проходит ещё один оборот и после этого i уже = -1 = 4294967295 отсюда и получается зацикленость.
Вот-так вот...)))

Yesaulov Danil - 31 Октябрь 2007 21:47

Вот тут Василий про uint писал:
http://flash.korax.ru/?p=26

Андрей Горбатов - 31 Октябрь 2007 23:23

В цикле с j замени j++ на j+=1. И pointsCount++ на pointsCount+=1.

__etc - 1 Ноябрь 2007 11:48

Друзья, спасибо за дельные коменты, очень порадовали.

Moulin Cook™ - да, вот попался такой проект, где миллион чисел — не предел...

Рост - 1 Ноябрь 2007 14:10

Большое пасибо РОСТУ. Я до сих пор не знал, что uint неотрицательное.))))))))

Flastar - 5 Ноябрь 2007 15:40

2Racer:
>> число с плавающей точкой - занимает до 53 бит (кстати странно, почему не кратно 8).
Потому что 8 байт = 64 бита, из них 1 на знак, и 10 на мантиссу.

Антон Волков - 15 Ноябрь 2007 19:59



Это запись из категории 'Debug'. 10 еще cвежих:

Архивы по категориям:

3D-18, Adobe AIR-30, Animation-1, Apache Ant-1, Architecture-1, ARP-1, Art-25, Articles-26, AS3-52, Books-7, Business-3, Cairngorm-2, CI-1, Classes-10, Coding-30, Community-113, Components-19, Contests-28, Cool-Job-5, Debug-18, Design-26, Development-84, EMO-1, Events-13, Extensions-2, FAQ-8, FDS-1, Flash and html-5, Flash Player-35, Flash Updates-8, Flash-scene-1, flash10-4, FlashLite-2, Flex-30, Flex 2-80, Flickr-1, FMS-1, FPUG-46, frameworks-1, Games-11, Good Job!-35, HaXe-14, Health-2, Humor-10, Ideas-13, JavaScript-1, Job-26, JSFL-8, Links-2, Linux-1, Maps-1, Math-8, Money-11, MXML-1, Open Source-15, Optimization-2, Patterns-2, Personalities-27, Politics-1, Preloading-3, Productivity-9, PureMVC-10, Pv3d-1, Rafpug-4, Red5-3, Remoting-11, Resources-21, Ruby-6, SAAS-1, Security-11, SEO-8, Silverlight-5, Sound-3, Strategy-120, Tamarin-1, Tools-113, Training-2, Trash-8, URAFPUG-13, Urgent-1, Usability-6, Video-6, VoIP-5, Wallop-1, Wishlist-2, Архив всех записей (большой)

За последние месяцы:

Июл 2008: Международная встреча разработчиков URAFPUG завершена, URAFPUG - трансляция студии Flex-фреймворка Mate, весь Июл

Июн 2008: Попытка предварительных выводов о встрече аниматоров, Онлайн трансляция встречи аниматоров в Донецке, весь Июн

Май 2008: Если 3D, то по-взрослому: официальный запрос в Adobe по поводу контроля над мип-маппингом. Нужна ваша поддержка!, В этом году «Russian Flash Awards» пройдет в «космическом стиле», весь Май

Апр 2008: Программирование под флэш платформу. Cтатья (местами спорная), Advanced Flash Components бесплатно раздает все свои AS2-компоненты, весь Апр

Мар 2008: Зарплаты программистов в 2007 году, FlashPhone как технология года? Технология года? В Рунете?, весь Мар

Фев 2008: ЙА ФПУГ — регистрация на первую встречу UAFPUG продолжается, Закулисы Flex и секрет успеха опенсорс-проекта, весь Фев





Примечания:
Статус документа
: в процессе
   2002-2007 Производство: Рост Прибыли · О проекте · Подписка на новости (RSS)