Сортируем 300 000 Number быстро, ещё быстрее.
Стандартный sort у Vector весьма тормозен, также осуществляет вызов функции на каждом сравнении, что не есть гуд. Эту сортировку можно оптимизировать как алгоритмически, так и просто ускорить итерацию. Тов. geser опубликовал заметку о том как можно сделать не только быструю сортировку слиянием, но и вынести самые последние часты итерации в шейдер. Почитать можно у нас, на someideas.ru там же есть исходники и проект FD. На моей машине(C2D@3.6Ghz, GTS250) стандартная сортировка занимает 2389 миллисекунд, ручная реализация слияния без шейдера 137 и с шейдером 121 соответственно. При этом прирост наблюдается и на атомном нетбуке.
Всего комментариев 10
Комментарии
12.06.2011 13:51 | |
12.06.2011 15:12 | |
А если сделать совсем нормально и возвращать еще и 0, то будет еще быстрее.
|
12.06.2011 16:08 | |
12.06.2011 17:32 | |
Цитата:
bubble
|
12.06.2011 18:07 | |
@Aquahawk. Добавьте ещё один знак "=" в сравнение (чтобы получилось "===") будет ещё быстрее
|
12.06.2011 19:01 | |
действительно, очень небольшой но прирост есть.
|
12.06.2011 19:06 | |
да, тут на форуме уже тестили это момент (со знаком сравнения), поэтому всегда стараюсь ставить "===" вместо "==", когда это возможно, конечно.
|
17.06.2011 12:45 | |
мой вариант реализации сортировки:
var a:Vector.<Number> = new Vector.<Number>(); for (var i:int = 0; i < 300000; i++) { a.push(Math.random()); } function sort(left:int, right:int):void { var i:int = left; var j:int = right; var middle:int = i + j >> 1; var x:Number = a[middle]; while (i <= j) { var ai:Number = a[i]; var aj:Number = a[j]; while (ai < x) ai = a[++i]; while (aj > x) aj = a[--j]; if (i <= j) { a[i++] = aj; a[j--] = ai; } } if (left < j) sort(left, j); if (i < right) sort(i, right); } function comp(x:Number, y:Number):int{ if (x < y){ return -1; }else{ if (x === y){ return 0; }else{ return 1; } } } var t:Number = new Date() .time; sort(0, a.length - 1);// 101 ms //a.sort(comp);//525 trace(String(new Date() .time - t)); |
|
Обновил(-а) nuToH 17.06.2011 в 14:58
|
Последние записи от Aquahawk
- Мини головоломка про троичность двоичного. (09.10.2012)
- Создание инстанса объекта без статической инициализации класса. (10.09.2012)
- Меняем константы где захотим. (21.03.2012)
- Сортируем 300 000 Number быстро, ещё быстрее. (11.06.2011)