2014-02-20 2 views
1

Это немного похожий вопрос на javascript switch vs loop on array, но другой. СравнитьПреимущества по сравнению с коммутатором

function Function1 (n) { 
    switch (n) { 
    case 0: 
     return "apple"; 
    break; 
    case 1: 
     return "pear"; 
    break; 
    // and a few more, or many more 
    } 
} 

и

var Array2 = ["apple", "pear"]; // and more 

который затем позвонить или обратиться в случае необходимости. Во-вторых, это намного опережает, но есть ли какие-то важные недостатки, а не только скорости, но и использования памяти? Будет ли ответ сильно изменяться, если в массиве будет больше случаев/элементов? Является ли ваш ответ специфичным для Javascript или общим принципом программирования? Спасибо.

+0

Массив поиск является таким же, как поиск _Object_, который (в большинстве реализаций) делается с помощью хэш-таблицы, так что это ** ** очень быстро даже с большими структурами , Это отличается от 'switch', который фактически совпадает с серией' if's –

+0

. Если вам нужно получить доступ к данным по индексу, используйте структуру, которая обращается к данным по индексу. Зачем переходить через несколько условных выражений или оптимизировать компилятор для поиска и обфускации кода? –

+0

Спасибо. Нет причин, кроме как не знать, нет ли каких-либо скрытых преимуществ. :) – user3334085

ответ

0

отвечу как общий принцип программирования:

(1) Массивы магазин все строки в памяти для всего их объема, или на языке, таком как C/C++, где память вручную выделяется, пока память явно освобождена. Для больших массивов это может быть очень интенсивным для памяти.

(2) В отличие от switch(), когда добавление объекта происходит в постоянное время, добавление или удаление объекта в начале или в середине массива потребует повторного использования всех последующих элементов в их новых местах. Это может потребовать, чтобы все объекты были восстановлены, если массив должен расти, поскольку массив как структура данных имеет фиксированное количество элементов, а для выращивания массива потребуется объявление и повторная инициализация элементов нового массива, если нет места оставил.

(3) Для поиска переключатель() встречается в линейном времени, тогда как поиск массива происходит в гораздо более быстрое постоянное время.

+1

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

+0

Хорошая точка. Тем не менее массивы хранят строки в последовательных местах памяти, что может быть проблематично, если массив большой. С другой стороны, хранение коммутационных шкафов зависит от компилятора. –

+0

Если ваши данные получают THAT большой, вам, вероятно, лучше всего просто поместить его в базу данных. –

Смежные вопросы