![]() |
Что быстрее работает Switch или If операторы
Что быстрее работает Switch или If операторы?Тестировал кто нибудь? поделитесь опытом
|
Свич быстрее, хоть и не значительно. Но писать его сложнее, в смысле набора текста, и выглядит эта конструкци, на мой взгляд, уродливее.
Плюс если условия не большие и их не много, особой разницы нет. |
Собственно, тесты:
1. Тест на сравнение '==', результат: Код:
Test started, 100000000 iterattions!Код:
Test started, 100000000 iterattions!Код AS3:
Switch подходит для сравнения конкретных результатов, вкладывая в него '<' мы фактически создаем ещё одно под условие, отсюда такой плохой результат. Писать его не сложно и он очень удобен для перебора заранее известных результатов. Получаются ясные и красивые конструкций. Добавлено через 25 минут Особенно стоит отметить возможность указания последовательных меток в switch: Код AS3:
|
Делать тесты в дебаг плеере безсмысленно.
|
Заморачиваться насчет скорости выполнения конструкций "switch" и "if" бессмысленно.
|
Цитата:
|
В некоторых случаях можно вообще обойтись хеш-таблицей.
|
У меня switch тоже показывает худшие результаты по сравнению с if. Однако, разница не может быть почти в 6 раз, как у вас. У меня в этом же коде switch отстает от if на 25%, но не 600%, этого просто не может быть.
И тем не менее я уверен, что выбор в пользу switch или if не должен диктоваться производительностью. |
|
странно, всегда думал, что в ас3 это должно быть как в других языках
http://stackoverflow.com/questions/7...an-switch-case хотя возможно так и есть, просто все вышеприведенные тесты не достоверны. Надо протестировать на большом количестве условий |
Цитата:
Цитата:
|
Цитата:
Не могу сказать какие результаты будут на продуктивной версии FP, лень заниматься ненужными вещами, но по моему скромному мнению результаты будут идентичными в процентном соотношении, возможно, время несколько сократится, но и в это я не охотно верю. Вообще люди любят заниматься вещами, которые не нужно делать, и конкретно данное сравнение производительности очень яркий тому пример. |
Цитата:
Ты же даже не написал с каким типом данных работаешь. Нужно сравнить? Код:
a = системное время |
На сколько я знаю, байткод который генерится в обоих случаях - разный, но нужно понимать, что в случае с switch компилятор все равно сгенерирует какое-то подобие default кейса - куда выполнение попадет, если ни одно из сравнений не сработало, и откуда продолжит обычное выполнение. Но это мелочи.
На уровне байткода switch не оптимизируется в хеш-таблицу в AS3. Он мог бы в принципе оптимизироваться JIT компилятором, но это было бы платформо-зависимо. Еще нужно понимать, что switch - более сложная конструкция, и занимает больше регистров (ему еще нужно хранить где-то переменную-счетчик посещенных кейсов). Так что в зависимости от количества свободных регистров производительность может меняться. Но самое главное в том, что какой бы из двух способов ни был быстрее в ваших тестах, даже если вы их грамотно провели - нет никакой теоретической необходимости для того, чтобы один из способов был быстрее, и рассчитывать на это - бессмысленно. Если на каком-то конкретном компьютере, операционной системе и версии плеера вы получили какой-то результат - это мало о чем говорит даже для конкретной ситуации, не говоря уже о других ситуациях. Кроме того, разница на столько не принципиальна, что в AS3 нет просто физически возможности решать такие задачи, где эта разница на что-то повлияла бы. Т.е. если бы мы говорили о суперкомпьютерах, где рассчитывают взаимодействие молекул белков, или траектории спутников - тогда, возможно, это имело бы смысл, и то в самую последнюю очередь. В AS3 вы по другим причинам не сможете даже взяться за решение задачи, на решении которой такая разница может хоть как-то отразиться. И последнее. В строгом смысле слова (но по этому поводу можно начать отдельную дискуссию). if и switch - не операторы. Их иногда называют операторами благодаря плохому переводу книжек посвященных теории компиляторов (в разделе грамматик), где операторы-функции и операторы - ключевые слова в выражениях перевели одинаково. Я все-таки за то, чтобы операторами называть только разновидность функций которые в силу придурковатости языка на котором мы пишем мы должны использовать не так, как типичные функции. Т.е. Для языка AS типичная функция (ее применение) записывается как Код:
имя(список аргументов)Код:
имя аргументКод:
аргумент имя аргументКод:
аргумент имяif и switch - в AS - это не функции (есть языки, в которых это функции), а части выражений. Внутри этих выражений они выступают в качестве "оператора" этого выражения, но для избежания путаницы с настоящими операторами, и с точки зрения синтаксиса языка - это ключевые слова. Хотя в вопросе однозначно имелись в виду конструкции, в которых эти ключевые слова используются. Потому что само по себе ключевое слово if или switch, хотите вы его назвать оператором, или нет, не выполняется ни за какое время т.как вообще не выполняется. Выполняется код в конструкции. |
Цитата:
|
Хеш-таблица - коллекция в которой доступ к элементам осуществляется по ключам. Ключи хешируются, т.е. для создания ключей используется функция генерирующая элементы фиксированого размера (как правило числа) с сохранением уникальности. Таким образом достигается фиксированная скорость доступа к элементам коллекции.
Как правило хеш-таблицы не упорядочены. Т.е. ключи могут встречаться в произвольном порядке. Очень часто в качестве исходных ключей выступают строки, реже - числа или символы (специальный вид неизменяемых строк, таких в AS нет), но в принципе может быть что угодно. Типичная функция хеширования - MD5, но их, опять же, есть много разных. Типичная реализация хеш-таблицы (для того, чтобы обеспечить фиксированое время доступа) - красно-черное (бинарное) дерево. Т.е. ключи складываются в бинарное дерево. Но бывают еще и реализации на списках, или на trie - своеобразный вид коллекции, где ключи имеющие одинаковые фрагменты могут совместно использовать эти фрагменты - это характерно для больших неизменяемых таблиц, т.как позволяет экономить память и немного быстрее обычного бинарного дерва, но затратно по созданию. В AS3 есть два встроенных класса хеш-таблиц, Object (и любой динамический класс) и Dictionary. Первые используют только строки в качестве ключей, второй - любые "сложные" объекты. Т.е. на самом базисном уровне, любой AS3 объект является в реализации хеш-таблицей с ключами-строками, но Dictionary отличается тем, что может, дополнительно использовать другие типы данных в качестве ключей. |
| Часовой пояс GMT +4, время: 22:12. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.