我目前正在使用svg转换库,其中包装了伪装者: https://github.com/etienne-martin/svg-to-img
每次调用其convert函数后,它将等待500毫秒,如果没有其他调用,它将关闭浏览器实例,并在随后的调用中再次调用 puppeteer.launch 。
我在Kubernetes集群中运行的docker容器内部使用了它。我想知道连续调用 puppeteer.launch 而不是连接到已经运行的无头chrome实例有多昂贵。
我正在考虑始终让一个运行无头chrome实例的docker容器并通过svg转换从我的docker容器连接到它。
在进行此操作之前,我想了解启动与 connect 的幕后发生的事情。
答案 0 :(得分:2)
puppeteer.launch()
启动Chrome实例,然后连接到该实例。根据您的硬件,启动铬实例的时间在100到150毫秒之间。连接会立即发生(因为它是本地计算机上的Websocket)。
puppeteer.connect()
仅连接到现有的铬实例。
puppeteer.connect()
调用和所有后续伪造函数调用引入网络延迟。延迟将完全取决于网络,但是如果您的计算机位于同一位置,则延迟应小于10毫秒。关于链接的库:看起来,链接的库不支持连接到伪造的人实例。您也可以将库放在机器上,并提供一个接收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
木偶源代码:
您可以通过检查相关功能的源代码来查看幕后发生的事情: