В чем разница в производительности puppeteer.launch () по сравнению с puppeteer.connect ()? - PullRequest
0 голосов
/ 20 сентября 2018

В настоящее время я использую библиотеку преобразования svg, которая упаковывает puppeteer:
https://github.com/etienne-martin/svg-to-img

После каждого вызова его функции преобразования он ждет 500 мс, и если других вызовов нет, то онзакрывает экземпляр браузера и при последующем вызове снова вызывает puppeteer.launch .

Я использую это внутри контейнера докера, работающего в кластере Kubernetes.Мне интересно, как дорого постоянно звонить puppeteer.launch по сравнению с подключением к уже запущенному экземпляру безголового хрома.

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

Прежде чем сделать это, я хотел получить представление о том, что происходит за кулисами в сценах launch vs connect .

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

puppeteer.launch ()

puppeteer.launch() запускает экземпляр хрома и впоследствии подключается к нему.Запуск экземпляра хрома занимает от 100 до 150 мс в зависимости от вашего оборудования.Соединение происходит мгновенно (так как это веб-сокет на локальной машине).

puppeteer.connect ()

puppeteer.connect() подключается только к существующему экземпляру хрома.

  • Если экземпляр, к которому вы подключаетесь, находится на том же компьютере, что и ваш скрипт, это должно произойти мгновенно, как и раньше (<1 мс). </li>
  • Если вы запустите экземпляр хрома на втором компьютере, вы представитесетевая задержка для вызова puppeteer.connect() и всех последующих вызовов функции кукловода .Задержка будет полностью зависеть от сети, но если ваши машины находятся в одном и том же месте, она должна быть ниже 10 мс.

svg-to-img

Относительно библиотеки, которую вы подключили:Похоже, что библиотека, которую вы связали, не поддерживает подключение к экземпляру кукловода.Вы также можете разместить библиотеку на компьютере и предложить API, который получает код SVG и возвращает изображение.Таким образом, вы можете поддерживать работу экземпляров хрома.

0 голосов
/ 21 сентября 2018

Краткий ответ:

Использование puppeteer.connect() / browser.disconnect() по возможности лучше с точки зрения производительности и в ≈ 146 раз быстрее , чем при использовании puppeteer.launch() / browser.close() (согласно моим тестам производительности).

Подробный ответ:

Я провел несколько тестов, чтобы сравнить производительность вызова puppeteer.connect() / browser.disconnect() против puppeteer.launch() / browser.close().

Каждый метод был проверен 10 000 раз, а общее время для всех итераций и среднее время для каждой итерации были

Мои тесты показали, что использование puppeteer.connect() / browser.disconnect() примерно в 146 раз быстрее , чем использование puppeteer.launch() / browser.close().

Вы можете выполнитьтесты на собственной машине с использованием приведенного ниже кода.

Тест (puppeteer.launch() / browser.close()) :

'use strict';

const puppeteer       = require( 'puppeteer' );
const { performance } = require( 'perf_hooks' );

const iterations = 10000;

( async () =>
{
    let browser;

    const start_time = performance.now();

    for ( let i = 0; i < iterations; i++ )
    {
        browser = await puppeteer.launch();

        await browser.close();
    }

    const end_time = performance.now();

    const total_time   = end_time - start_time;
    const average_time = total_time / iterations;

    process.stdout.write (
          'Total Time:\t' + total_time + ' ms\n'
        + 'Average Time:\t' + average_time + ' ms\n'
        + 'Iterations:\t' + iterations.toLocaleString() + '\n'
    );
})();

Результат :

Общее время: 1339075.0866550002 мс

Среднее время: 133,90750866550002 мс

Итерации: 10 000

Тест (puppeteer.connect() / browser.disconnect()) :

'use strict';

const puppeteer       = require( 'puppeteer' );
const { performance } = require( 'perf_hooks' );

const iterations = 10000;

( async () =>
{
    let browser             = await puppeteer.launch();
    const browserWSEndpoint = browser.wsEndpoint();

    browser.disconnect();

    const start_time = performance.now();

    for ( let i = 0; i < iterations; i++ )
    {
        browser = await puppeteer.connect( { browserWSEndpoint } );

        browser.disconnect();
    }

    const end_time = performance.now();

    const total_time   = end_time - start_time;
    const average_time = total_time / iterations;

    process.stdout.write (
          'Total Time:\t' + total_time + ' ms\n'
        + 'Average Time:\t' + average_time + ' ms\n'
        + 'Iterations:\t' + iterations.toLocaleString() + '\n'
    );

    process.exit();
})();

Результат :

Общее время: 9198,328596000094мс

среднее время: 0,9198328596000094 мс

итерации: 10 000

Puppeteer Исходный код:

Вы можете посмотреть, что происходит за кулисами, проверив исходный код рассматриваемых функций:

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