Функциональный или императивный код для работы со значительно большим массивом в JavaScript? - PullRequest
0 голосов
/ 18 февраля 2019

При работе с массивом в JavaScript, что бы вы выбрали, функциональный или императивный способ, в то время как императив быстрее, чем функциональный.Я так растерялся.

Вот тест jsPerf Я запустил с обычным циклом и парой карты и фильтра.

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019

Разница между Array.map и циклом for заключается в том, что цикл for выполняет не что иное, как итерацию по значениям массива.Внутри тела цикла вы можете делать что угодно с этими значениями.Array.map делает больше, чем это.Он перебирает массив, создавая новый массив со значением обратного вызова, вызываемого для каждого значения.

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

В основном это то же самое, что и:

Цикл For:

const array = [1, 2, 3];
const mutatedArray = [];

for(let i = 0; i < array.length; i++) {
    let mutatedValue = array[i] * 2;

    mutatedArray.push(mutatedValue);
}

Array.map:

const array = [1, 2, 3];
const mutatedArray = array.map(x => x * 2);

Это намного чищеи быстрее написать.

0 голосов
/ 18 февраля 2019

Мои два цента: в целом, я предпочитаю работать с массивами по функциональному принципу, поскольку я считаю, что функциональные методы более гибкие, их легче читать и обслуживать.

Особенно там, где производительность не критична или нетt заметных отличий.

Допустим, что функциональный способ занимает в 50 раз больше времени обычного цикла.Если обычный цикл занимает 1 мс, это означает, что функционал занимает 50 мс, и в большинстве случаев это нормально.

Так что я бы не стал жертвовать своим кодом для оптимизации в этом случае, особенно в приложении и / илирасшаренное репо.

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

Сказал, что: в JS проблема метода массива заключается в том, что они не 'лень.Это означает, что в вашем случае вы повторяете массив дважды, потому что вызываете два метода (filter и map).В других языках (например, Rust) такой метод «ленив», и он не вызывается до тех пор, пока вы действительно не сделаете что-то с итератором: это уменьшит проблему производительности, которую вы можете сравнить с обычным циклом.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...