puppeteer.launch()与puppeteer.connect()的性能有何不同?

时间:2018-09-20 19:11:43

标签: docker puppeteer

我目前正在使用svg转换库,其中包装了伪装者:   https://github.com/etienne-martin/svg-to-img

每次调用其convert函数后,它将等待500毫秒,如果没有其他调用,它将关闭浏览器实例,并在随后的调用中再次调用 puppeteer.launch

我在Kubernetes集群中运行的docker容器内部使用了它。我想知道连续调用 puppeteer.launch 而不是连接到已经运行的无头chrome实例有多昂贵。

我正在考虑始终让一个运行无头chrome实例的docker容器并通过svg转换从我的docker容器连接到它。

在进行此操作之前,我想了解启动 connect 的幕后发生的事情。

2 个答案:

答案 0 :(得分:2)

puppeteer.launch()

puppeteer.launch()启动Chrome实例,然后连接到该实例。根据您的硬件,启动铬实例的时间在100到150毫秒之间。连接会立即发生(因为它是本地计算机上的Websocket)。

puppeteer.connect()

puppeteer.connect()仅连接到现有的铬实例。

  • 如果您要连接的实例与脚本位于同一台计算机上,则应该像以前一样立即发生(<1ms)。
  • 如果您在第二台计算机上运行Chrome实例,则会为puppeteer.connect()调用和所有后续伪造函数调用引入网络延迟。延迟将完全取决于网络,但是如果您的计算机位于同一位置,则延迟应小于10毫秒。

svg-to-img

关于链接的库:看起来,链接的库不支持连接到伪造的人实例。您也可以将库放在机器上,并提供一个接收SVG代码并返回图像的API。这样,您可以保持Chrome实例运行。

答案 1 :(得分:1)

简短答案:

从性能的角度来看,尽可能使用puppeteer.connect() / browser.disconnect()最好,并且比使用puppeteer.launch() / browser.close()快146倍(根据我的基准测试)。

详细答案:

我进行了一些测试,以比较调用puppeteer.connect() / browser.disconnect()puppeteer.launch() / browser.close()的性能。

每种方法进行了10,000次测试,并记录了所有迭代的总时间和每次迭代的平均时间。

我的测试发现,使用puppeteer.connect() / browser.disconnect()比使用puppeteer.launch() / browser.close()快大约 146倍

您可以使用下面提供的代码在自己的计算机上执行测试。

基准(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 ms

     

平均时间:133.90750866550002 ms

     

迭代次数: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 ms

     

平均时间:0.9198328596000094毫秒

     

迭代次数:10,000


木偶源代码:

您可以通过检查相关功能的源代码来查看幕后发生的事情: