Firefox与Chrome在webdriver中的内存消耗基准测试

3 投票
1 回答
1848 浏览
提问于 2025-05-01 09:28

我想尽可能多地在我的电脑上运行一些浏览器脚本。我该怎么知道每个Chrome或Firefox进程在我启动webdriver时消耗了多少内存呢?比如说:

from selenium import webdriver
driver = webdriver.Chrome()
driver.get('www.yahoo.com')

# - or - #

from selenium import webdriver
driver = webdriver.Firefox()
driver.get('www.yahoo.com')
暂无标签

1 个回答

5

当你使用 webdriver.Chromewebdriver.Firefox 时,至少会启动一个新的进程。为了估算总的内存使用情况,最简单的方法就是在启动这些进程之前和之后,测量一下系统可用的总内存。如何找到总共使用的内存,取决于你使用的操作系统;psutils模块 支持Linux、Windows、OSX、FreeBSD和Sun Solaris。

import os
import multiprocessing as mp
import contextlib
import time
import selenium.webdriver as webdriver
import selenium.webdriver.support.ui as UI
import selenium.webdriver.support.expected_conditions as EC
import psutil

def worker(browsername, args, N):
    start_mem = psutil.virtual_memory()
    Driver = getattr(webdriver, browsername)
    drivers = [Driver(*args) for i in range(N)]
    end_mem = psutil.virtual_memory()
    for driver in drivers:
        driver.quit()
    return end_mem.used - start_mem.used

if __name__ == '__main__':
    N = 10
    pool = mp.Pool(1)

    for driver, args in [('Firefox', ()),
                         ('Chrome', ()), 
                         ('PhantomJS', ('phantomjs',))]:
        used = pool.apply(worker, [driver, args, N])
        print('{:>10}: {}'.format(driver, used))
        time.sleep(5)

    pool.close()
    pool.join()

结果是

   Firefox: 1072779264
    Chrome: 1124683776
 PhantomJS: 102670336

所以看起来 PhantomJS 使用的内存大约少了10倍。

技术说明:没有可靠的方法可以强制一个Python进程将它使用的内存“归还”给操作系统,除非终止这个进程。所以我使用了多进程的方法,让每个测试在一个单独的进程中运行,这样当它结束时,使用的内存就会被释放。pool.apply() 会一直等待,直到 worker 结束。

撰写回答