![]() |
старый добрый swap() — возможен вообще?
У меня код как рулон обоев только из-за того, что я не вижу никакой возможности вынести конструкцию типа
Код AS3:
Такое вообще возможно на AS3? Скорость работы критична — таких операций десятки тысяч на кадр. |
А чего нельзя обернуть операцию в функцию статического класса?
|
Немножечко поумничаю: вроде как нет такого понятия "статический класс" в AS3, и функции класса принято называть методами.
Но не суть — а что это даст? Метод не работает с числовым аргументом как со ссылкой. Он его... как бы это сказать... локализует автоматом. Поэтому если ты передашь какой-то a:Number = 10.5 в какой-то метод, внутри которого происходит коварное a = 5.5, это не возымеет никакого эффекта снаружи. Там a по прежнему будет равняться 10.5 Если бы все было так просто ;) |
вариант - хранить 2 числа как объект или массив, тогда при передаче в функцию свап становится возможным )
|
Скорость доступа к динамическому полю объекта или к элементу массива расценивается как неудовлетворительная.
|
дык задай жестко, классом с паблик переменными - так очень даже удовлетворительно )
хотя конечно сама идея вызывать функцию, чтобы она меняла... Сам по-себе вызов функции дорогой.. Это если конечно настолько критично по скоростям. |
Менять надо походу четыре пары по одному условию. И если задуматься об организации swap-а для 12 переменных, с явным указанием на конкретную пару... как-то лучше как у меня сейчас:
Код AS3:
|
в байткоде кстати есть операция swap.. но это так, к слову :)
|
В функцию фиг знает как обернуть, но вобще можно обойтись и без 3 переменной.
Код AS3:
|
@i.o. тогда это свинство! ))
@Bgg хочешь сказать, что это быстрее? или так, к общей пьянке? ) |
Можно так:
a ^= b; b ^= a; a ^= b; |
Это сработает, если Вам не нужны хвосты после точки в числе...
|
А в AS3, часом, нет чего-нибудь вроде сишных макросов? Которые генерируют код в момент компиляции?
Если есть - может помочь. Добавлено через 46 секунд Цитата:
|
|
the_nitro, и как мне пользоваться этой операцией для swap-а координат U и V (это числа от 0 до 1), если результат возвращается в int?
|
Что-то подобное наверное сможет realaxy editor.
Также можно написать сниппет/плагин для FD. Но итоговый код всё равно будет с swap. |
Я тоже однажды озадачился таким вопросом. Универсальный метод написал такой (как в примере Bgg):
Код AS3:
Код AS3:
|
да уж проще тогда:
Код AS3:
Код AS3:
|
эээ...
Код AS3:
Добавлено через 3 минуты Опередил. Ну а если вернуться к коду из поста номер 7, то станет видно, что методы для swap-а двух конкретных значений не подойдут. Придется только для данного случая наплодить 8 новых функций. |
Да, это я лоханулся - конечно лишнее ).
Zebestov, а что, неужели в Haxe нет аналога ref? |
Цитата:
При условии, что значения нужно отдать после сортировки. Код AS3:
|
Предложенный алгоритм не эквивалентен моему. Посмотри внимательней, что он делает и как )
|
Правильно, ваш алгоритм меняет значения в переменых, А на Б и Б на А.
Мой алгоритм меняет А и Б местом(А становится Б, а Б становится А), что аналогично, при условии что значения нужно отдать. при этом не каких операций с сортировкой не ведется. |
а запись в одну строчку не прокатит? я обычно так и пишу
|
Vektor, алгоритмы разные по результату, а не по стилю его выдачи. Подсказка: повтор первого сравнения с последующей перестановкой в конце алгоритма — это не опечатка.
BlooDHounD, да как-то хрен редьки не слаще ) все равно этот рулончик живет в свернутом виде. |
Еще как вариант могу предложить класс NumberRef, который хранит значение числа.
NumberRef.as Код AS3:
Array/*Number*/: Цитата:
Цитата:
_testSwaping*() - оценка времени работы функции со свапингом При вычитании одного из другого, можем оценить насколько отличается время самого свапинга. Заодно выяснилось (в принципе оно давно было известно), что Vector.<> по времени доступа - тормоз. Но зато скорость записи случайных чисел достойна всех похвал ;) Код класса с тестами: Main.as Код AS3:
|
Код AS3:
|
Код AS3:
|
Вот тут выкладываю, логику моего алгоритма.
Код AS3:
P/S Конечно, тут кое что нужно дописать, но алгоритм рассчитан, сортировать не сортируя, человек должен скомпилить логику и выдать нагора результат, при условии что нужна скорость. Компьютер может делать умножения, но зачем это делать, если нужен только результат... |
Тогда уж: a = a + b - (b = a); Чтобы без умножения)) это нужно на олимпиадах по информатике давать =)
|
Цитата:
|
О! Пошла жара ) извраты конечно )) но можно попробовать. Хотя кроме компактности эти хитрости больше ничего не дают. Заменить одно присваивание на сложение и вычитание боюсь никак не оптимизация ) но прикольно!
Добавлено через 5 минут В HaXe я еще начинающий, так что не в курсе что там и как. Прошелся по докам — указателей не обнаружил. |
Zebestov, что ты возмущаешься?
Код AS3:
114 184 =) |
Отлично! Мой случай правда Number, но там тоже в среднем ваш алгоритм быстрее на 35-40%
|
Ладно, обманул я тебя =) Не быстрее, только в дебаг версии так получается, где номер строки отслеживается. Запишешь в одну строчку s = a; a = b; b = s; и уже медленнее
|
Хха! Век живи ) я не знал об этом нюансе.
|
в дебаг версии вообще не стоит сравнивать быстродействие.
|
вот еще вариант для int:
Код AS1/AS2:
по идее b = a ^ 0 & (a = b); будет быстрее |
| Часовой пояс GMT +4, время: 15:49. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.