zkrvndm
@zkrvndm
Архитектор решений

Как ускорить выполнение JavaScript в браузере? Как распаралелить JavaScript?

Каким образом можно было бы распаралелить выполнение JavaScript в браузере? Например, если сгенерировать множество фреймов и расчеты вести внутри них по частям, будут ли он выполнятся в отдельных потоках паралельно?

Пояснения, если нужны детали
Дело в том, что у меня возникала нестандартная задача по парсингу больших объемов текста посредством регулярных выражений (конкретно в браузере). Нестандартность заключается в том, что разобрать тексты нужно максимально быстро: каждую секунду я получаю 10 текстов, на разбор каждого текста регулярками уходит в среднем 3 секунды, если обрабатывать тексты последовательно, это уйдет целых пол минуты, прежде, чем я получу результат по всем 10-ти текстам. Соответственно, у меня закономерно возникает вопрос, а не могу ли я каким-нибудь хитрым трюком распаралелить код? Например, каждый полученный текст разбирать в своем фрейме или popup-окне? Как обычно в таких случаях поступают, когда надо выполнить код в браузере в несколько потоков?

Заранее спасибо, всем кто готов помочь советом или направляющим пинком. Добавлю, что ограничений в плане ресурсов у меня нет, код будет выполнятся в браузере на физическом сервере с туевой хучей ядер и большим количеством оперативки.
  • Вопрос задан
  • 562 просмотра
Пригласить эксперта
Ответы на вопрос 4
bingo347
@bingo347 Куратор тега JavaScript
Crazy on performance...
Однозначно нужно выносить эту работу в WebWorker'ы
Вот тут можно почитать: https://developer.mozilla.org/ru/docs/DOM/Using_we...

Ну и еще в плане ускорения, так ли нужно парсить текст регулярками? Регулярки очень медленные. И на больших объемах текста естественно это становится заметно. Разбор текста узконаправленным алгоритмом, сделанным под конкретный формат данных будет в разы быстрее, если правильно его сделать.
Ответ написан
@ned4ded
Верстка, Фронтенд
Распараллелить - нет, но вы можете чанковать текст и парсить его чанки асинхронно, что освободит основной поток.

const arr = [1, 2, 3, 4, 5];

const rec = (theArr) => {
    const [first, ...rest] = theArr;

    if (!first) return;

    setTimeout(() => {
        /* do some parsing, example: */
        if ([3, 4].includes(first)) alert('found it!');

        return rec(rest);
    }, 0);
};

rec(arr);
Ответ написан
hzzzzl
@hzzzzl
есть веб воркеры, которые выполняются в отдельном процессе, но я с ними дела не имел, кроме как "просто попробовать поиграться", так что тут не подскажу
https://developer.mozilla.org/ru/docs/Web/API/Web_...

а если в промисы замотать, то быстрее не станет?

function parse(txt = '') {
  return Promise.resolve(txt.match(/a/gi))
}

texts = ['astajf;lj3', 'AAjfjia33r', '4jlj;lajaaa', 'afdj df jas fjsa ja33a']

await Promise.all(texts.map(parse))
// (4) [Array(2), Array(3), Array(4), Array(5)]
Ответ написан
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
Наиболее простой вариант:
includeHTML создаёте один js-ник с функцией обработки, и циклом загружаете его несколько раз: как только ушёл запрос на загрузку - тут же идёт следующий цикл без ожиданий!.
Сразу после загрузки, в обработчике, вызываете функцию с нужными параметрами и она сразу начинает считать/парсить/etc.
И так, для всех итераций цикла: всё происходит параллельно!

По необходимости, сами следите и контролируйте количество активных/одновременных исполняющихся скриптов через переменную-счётчик.

Всё работает асинхронно!
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы