Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Что быстрее работает Switch или If операторы (http://www.flasher.ru/forum/showthread.php?t=184181)

Isfet 12.09.2012 21:47

Что быстрее работает Switch или If операторы
 
Что быстрее работает Switch или If операторы?Тестировал кто нибудь? поделитесь опытом

caseyryan 12.09.2012 22:00

Свич быстрее, хоть и не значительно. Но писать его сложнее, в смысле набора текста, и выглядит эта конструкци, на мой взгляд, уродливее.
Плюс если условия не большие и их не много, особой разницы нет.

Tails 12.09.2012 22:28

Собственно, тесты:

1. Тест на сравнение '==', результат:
Код:

Test started, 100000000 iterattions!
if:        1453 milisecconds
switch:        1831 milisecconds
version: WIN 10,1,52,14

2. Тест на условие '<', результат:
Код:

Test started, 100000000 iterattions!
if:        1272 milliseconds
switch:        6568 milliseconds
version: WIN 10,1,52,14

Код тестов одинаковый, меняются лишь условия:
Код AS3:

import flash.events.TimerEvent;
import flash.utils.Timer;
import flash.system.Capabilities;
 
var test:int = 100000000;
var timer:Timer = new Timer(1000, 1);
timer.addEventListener(TimerEvent.TIMER_COMPLETE, startTest);
timer.start();
trace('Test started, '+test+' iterattions!');
 
function startTest(e:TimerEvent):void{
        var b:int = 0;
        var timeStart:Number = getTimer();
 
        for(var i:int = 0; i<test; i++){
 
                if(i<0){
                b++;
                }else if(i<0){
                b++;
                }else if(i<0){
                b++;
                }
        }
 
        trace('if:        '+(getTimer()-timeStart)+' milliseconds');
        b = 0;
        timeStart = getTimer();
 
        for(var j:int = 0; j<test; j++){
                switch(j){
                        case j<0:
                        b++;
                        break;
 
                        case j<0:
                        b++;
                        break;
 
                        case j<0:
                        b++;
                        break;
                }
        }
 
        trace('switch:'+(getTimer()-timeStart)+' milliseconds');
        trace('version: '+Capabilities.version);
}

Добавлено через 13 минут
Switch подходит для сравнения конкретных результатов, вкладывая в него '<' мы фактически создаем ещё одно под условие, отсюда такой плохой результат.

Писать его не сложно и он очень удобен для перебора заранее известных результатов. Получаются ясные и красивые конструкций.

Добавлено через 25 минут
Особенно стоит отметить возможность указания последовательных меток в switch:
Код AS3:

case 1:
case 2:
case 3:
// code
break;


alatar 13.09.2012 00:18

Делать тесты в дебаг плеере безсмысленно.

zuxul 13.09.2012 01:19

Заморачиваться насчет скорости выполнения конструкций "switch" и "if" бессмысленно.

Bgg 13.09.2012 01:48

Цитата:

Сообщение от zuxul (Сообщение 1095742)
Заморачиваться насчет скорости выполнения конструкций "switch" и "if" бессмысленно.

Ну почему, вдруг у автора несколько миллиардов свитчей/условных операторов. Может и поможет.

GBee 13.09.2012 02:01

В некоторых случаях можно вообще обойтись хеш-таблицей.

Vreden 13.09.2012 03:28

У меня switch тоже показывает худшие результаты по сравнению с if. Однако, разница не может быть почти в 6 раз, как у вас. У меня в этом же коде switch отстает от if на 25%, но не 600%, этого просто не может быть.

И тем не менее я уверен, что выбор в пользу switch или if не должен диктоваться производительностью.

fljot 14.09.2012 03:41

http://jacksondunstan.com/articles/793
http://jacksondunstan.com/articles/1007

caseyryan 14.09.2012 09:45

странно, всегда думал, что в ас3 это должно быть как в других языках
http://stackoverflow.com/questions/7...an-switch-case

хотя возможно так и есть, просто все вышеприведенные тесты не достоверны.
Надо протестировать на большом количестве условий

zuxul 14.09.2012 15:12

Цитата:

Сообщение от Bgg (Сообщение 1095745)
Ну почему, вдруг у автора несколько миллиардов свитчей/условных операторов. Может и поможет.

Точно не поможет. Ему поможет:
Цитата:

Сообщение от GBee (Сообщение 1095746)
В некоторых случаях можно вообще обойтись хеш-таблицей.

Выбор из хэш-таблицы будет на порядок быстрее, а не та разница в 20-10 процентов.

Vreden 15.09.2012 00:16

Цитата:

Сообщение от caseyryan (Сообщение 1095923)
хотя возможно так и есть, просто все вышеприведенные тесты не достоверны.
Надо протестировать на большом количестве условий

Тестировал на 180 условий в цикле, по всякому тестировал, результаты идентичны, switch отстает от if на 25%, очень редко получал результаты, где switch отставал на 5%

Не могу сказать какие результаты будут на продуктивной версии FP, лень заниматься ненужными вещами, но по моему скромному мнению результаты будут идентичными в процентном соотношении, возможно, время несколько сократится, но и в это я не охотно верю.

Вообще люди любят заниматься вещами, которые не нужно делать, и конкретно данное сравнение производительности очень яркий тому пример.

KVinS 16.09.2012 17:12

Цитата:

Сообщение от Isfet (Сообщение 1095721)
Что быстрее работает Switch или If операторы?Тестировал кто нибудь? поделитесь опытом

Все эти "быстрее" размыто.
Ты же даже не написал с каким типом данных работаешь.

Нужно сравнить?
Код:

a = системное время
код 1
trace(системное время - a)

a = системное время
код 2
trace(системное время - a)


wvxvw 16.09.2012 19:00

На сколько я знаю, байткод который генерится в обоих случаях - разный, но нужно понимать, что в случае с switch компилятор все равно сгенерирует какое-то подобие default кейса - куда выполнение попадет, если ни одно из сравнений не сработало, и откуда продолжит обычное выполнение. Но это мелочи.
На уровне байткода switch не оптимизируется в хеш-таблицу в AS3. Он мог бы в принципе оптимизироваться JIT компилятором, но это было бы платформо-зависимо.

Еще нужно понимать, что switch - более сложная конструкция, и занимает больше регистров (ему еще нужно хранить где-то переменную-счетчик посещенных кейсов). Так что в зависимости от количества свободных регистров производительность может меняться.

Но самое главное в том, что какой бы из двух способов ни был быстрее в ваших тестах, даже если вы их грамотно провели - нет никакой теоретической необходимости для того, чтобы один из способов был быстрее, и рассчитывать на это - бессмысленно. Если на каком-то конкретном компьютере, операционной системе и версии плеера вы получили какой-то результат - это мало о чем говорит даже для конкретной ситуации, не говоря уже о других ситуациях.
Кроме того, разница на столько не принципиальна, что в AS3 нет просто физически возможности решать такие задачи, где эта разница на что-то повлияла бы. Т.е. если бы мы говорили о суперкомпьютерах, где рассчитывают взаимодействие молекул белков, или траектории спутников - тогда, возможно, это имело бы смысл, и то в самую последнюю очередь. В AS3 вы по другим причинам не сможете даже взяться за решение задачи, на решении которой такая разница может хоть как-то отразиться.

И последнее. В строгом смысле слова (но по этому поводу можно начать отдельную дискуссию). if и switch - не операторы. Их иногда называют операторами благодаря плохому переводу книжек посвященных теории компиляторов (в разделе грамматик), где операторы-функции и операторы - ключевые слова в выражениях перевели одинаково. Я все-таки за то, чтобы операторами называть только разновидность функций которые в силу придурковатости языка на котором мы пишем мы должны использовать не так, как типичные функции. Т.е. Для языка AS типичная функция (ее применение) записывается как
Код:

имя(список аргументов)
а "дурацкие" функции могут записываться как
Код:

имя аргумент
Код:

аргумент имя аргумент
Код:

аргумент имя
Потому что кому-то показалось, что чем запутаннее, тем понятнее.
if и switch - в AS - это не функции (есть языки, в которых это функции), а части выражений. Внутри этих выражений они выступают в качестве "оператора" этого выражения, но для избежания путаницы с настоящими операторами, и с точки зрения синтаксиса языка - это ключевые слова. Хотя в вопросе однозначно имелись в виду конструкции, в которых эти ключевые слова используются. Потому что само по себе ключевое слово if или switch, хотите вы его назвать оператором, или нет, не выполняется ни за какое время т.как вообще не выполняется. Выполняется код в конструкции.

Isfet 16.09.2012 19:29

Цитата:

Сообщение от zuxul (Сообщение 1095968)
Точно не поможет. Ему поможет:

Выбор из хэш-таблицы будет на порядок быстрее, а не та разница в 20-10 процентов.

а может кто-нибудь рассказать что такое хэш-таблица, и с чем ее едят? или хотя бы ссылочку.

wvxvw 16.09.2012 20:54

Хеш-таблица - коллекция в которой доступ к элементам осуществляется по ключам. Ключи хешируются, т.е. для создания ключей используется функция генерирующая элементы фиксированого размера (как правило числа) с сохранением уникальности. Таким образом достигается фиксированная скорость доступа к элементам коллекции.
Как правило хеш-таблицы не упорядочены. Т.е. ключи могут встречаться в произвольном порядке. Очень часто в качестве исходных ключей выступают строки, реже - числа или символы (специальный вид неизменяемых строк, таких в 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
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.