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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 18.05.2011, 13:37
semenyakinVS вне форума Посмотреть профиль Отправить личное сообщение для semenyakinVS Найти все сообщения от semenyakinVS
  № 1  
Ответить с цитированием
semenyakinVS

Регистрация: Mar 2010
Сообщений: 137
По умолчанию Сортировка в векторе с элементами null

Обнаружил достаточно забавный факт.
Есть, например, вот такой код:

Код AS3:
var valVect:Vector.<ListEl> = new Vector.<ListEl>();
 
var findCount:int = 500; // Задаём количество не null элементов из общего количества 3000
 
for(i = 0 ; i < findCount ; i++)
{
	valVect.push(new ListEl(Math.random()*8)); // Параметр просто инициализирует значение param:Number
}
for( ; i < 3000 ; i++)
{
	valVect.push(null);
}
 
time = getTimer();
 
valVect.sort(function(a:ListEl,b:ListEl)
{
	if(a == null)
	{
		return -1;
	}
	else if(b == null)
	{
		return 1;
	}
	else
	{							
	return (a.param == b.param) ? 0 : ((a.param > b.param) ? 1 : -1);								
	}
});
 
trace(getTimer() - time);
Этот код работает тем дольше, чем больше null-элементов в векторе. Думал, это связанно с особенностями quick sort, он, кажется, плохо работает с уже сортированными структурами данных, но нет. Заменял null на конструкторы с единицами - всё становилось хорошо, работало моментально.

При всех null - 800 мс против 2 мс при полном отсутствии null в векторе.

P.S.: Ещё, раз уж зайдёт речь про вектора, задам несколько глупых вопросов.

1. Какая польза от использования свойства fixed = true? Понимаю, по ходу прирост скорости, но за счёт чего, что при этом происходит в самом векторе?

2. Можно ли реализовать вообще фиксированный вектор, чтобы обращение по индексу к элементам шло не итератором или ещё чёртичем для списка, а по смещению?

Старый 18.05.2011, 14:05
maxkar вне форума Посмотреть профиль Отправить личное сообщение для maxkar Найти все сообщения от maxkar
  № 2  
Ответить с цитированием
maxkar

Регистрация: Nov 2010
Сообщений: 497
Тормоза кода связаны с тем, что ваш компаратор генерирует полную фигню на выходе. От него вообще-то ожидается, что если a < b, то b > a. А у вас если a == null и b == null указанное не выполняется. Поэтому можно даже и корректности сортировки не получить.

1. В первую очередь из-за того, что его размер не меняется, экономятся перераспределения памяти. Вполне может быть, что просто отсутствие изменения размера массива (с fixed == false) по быстродействию окажется таким же, что и при fixed == true.

2. А почему вы решили, что обращение идет итератором или по списку? Вектор то (в отличие от массива) плотная (dense) структура, на ней эффективно реализуется индексный доступ. В том числе и для resizeable vector, с амортизированной сложностью добавления и удаления в конец списка O(1).

Старый 18.05.2011, 14:41
semenyakinVS вне форума Посмотреть профиль Отправить личное сообщение для semenyakinVS Найти все сообщения от semenyakinVS
  № 3  
Ответить с цитированием
semenyakinVS

Регистрация: Mar 2010
Сообщений: 137
Ничего подобного. Компаратор правильно написан. Я проверил.
Единственное - он сортирует null-элементы в начало вектора, но это не влияет на время выполнения (это я тоже проверил).

Добавлено через 3 минуты
За ответы на вопросы спасибо.

Старый 18.05.2011, 14:51
maxkar вне форума Посмотреть профиль Отправить личное сообщение для maxkar Найти все сообщения от maxkar
  № 4  
Ответить с цитированием
maxkar

Регистрация: Nov 2010
Сообщений: 497
Как же правильно то? Он почему-то считает, что null < null вместо того, что null == null. Компаратор не сортирует. Он сравнивает. И компаратор, игнорирующий при одном из сценариев выполнения второе значение правильным быть не может.

Старый 18.05.2011, 16:39
alatar вне форума Посмотреть профиль Отправить личное сообщение для alatar Найти все сообщения от alatar
  № 5  
Ответить с цитированием
alatar
 
Аватар для alatar

блогер
Регистрация: Dec 2008
Адрес: Israel, Natanya
Сообщений: 4,740
Записей в блоге: 11
Код AS3:
valVect.sort(function(a:Object,b:Object):int
{
    if(!a)
    {
        return -1;
    }
    else if(!b)
    {
        return 1;
    }
    else
    {							
        return (a.param == b.param) ? 0 : ((a.param > b.param) ? 1 : -1);								
    }
});
~1400-1850 ms
Код AS3:
valVect.sort(function(a:Object,b:Object):int
{
    if (!a && !b)
    {
        return 0;
    }
    else if(!a)
    {
        return -1;
    }
    else if(!b)
    {
        return 1;
    }
    else
    {							
        return (a.param == b.param) ? 0 : ((a.param > b.param) ? 1 : -1);								
    }
});
~50-200 ms
И это в дебаг версии.

Старый 18.05.2011, 16:54
semenyakinVS вне форума Посмотреть профиль Отправить личное сообщение для semenyakinVS Найти все сообщения от semenyakinVS
  № 6  
Ответить с цитированием
semenyakinVS

Регистрация: Mar 2010
Сообщений: 137
Аааа!.. Да, всё! Понял!
Был не прав. Тему можно закрывать.

P.S.:
Цитата:
if (!a && !b)
Круто! Не знал, что в AS так можно.

Старый 18.05.2011, 17:39
i.o. вне форума Посмотреть профиль Отправить личное сообщение для i.o. Найти все сообщения от i.o.
  № 7  
Ответить с цитированием
i.o.
 
Аватар для i.o.

Регистрация: Apr 2010
Адрес: Earth
Сообщений: 1,897
а если функцию сделать не анонимной, да еще и тип ей задать, то еще быстрее станет)

Старый 18.05.2011, 18:16
gloomyBrain вне форума Посмотреть профиль Отправить личное сообщение для gloomyBrain Найти все сообщения от gloomyBrain
  № 8  
Ответить с цитированием
gloomyBrain
 
Аватар для gloomyBrain

блогер
Регистрация: Mar 2008
Адрес: РФ, Санкт-Петербург
Сообщений: 2,272
Записей в блоге: 5
Отправить сообщение для gloomyBrain с помощью ICQ Отправить сообщение для gloomyBrain с помощью Skype™
Цитата:
а если функцию сделать не анонимной, да еще и тип ей задать, то еще быстрее станет
А если еще и !(a && b) написать, так оно вообще взлетит =)
__________________
...вселенская грусть

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

Теги
null , вектор , время выполнения

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

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


 


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


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