HtmlUnit比GUI浏览器慢?

bie*_*era 5 caching htmlunit

为什么HtmlUnit比GUI浏览器慢得多?例如,HtmlUnit 在14秒内加载此页面http://oltexpress.airkiosk.com/cgi-bin/airkiosk/I7/181002i?O2=2(当CSS支持关闭时),而FF在5秒内加载(清除缓存后) ,CSS支持).我知道,现代浏览器在处理糟糕的JS代码时没有那么严格,而HtmlUnit是,但是这里的时间差异仍然是无法容忍的.

有关如何加快使用HtmlUnit的任何想法?有没有人玩过HtmlUnit缓存?

Lee*_*Lee 5

要回答你为什么这么慢的问题:

这纯粹是因为HTMLUnit有许多不利因素:

  • 它以编译语言运行,没有很多浏览器的原生优化,如FireFox.
  • 它需要格式良好的XML而不是HTML(非严格),这意味着它必须将HTML转换为XML.
  • 然后它必须通过解析器运行JavaScript,修复代码的任何问题,然后在Java内部处理它.
  • 另外正如@Arya指出的那样,它一次只能请求一个东西,因此很多javascript文件会导致速度变慢,许多图像会导致速度变慢.

要回答有关如何加快速度的问题:

作为一般规则,我禁用(除非他们需要):

  • JavaScript的
  • 图片
  • CSS
  • 小程序.

我还获得了源代码并删除了ActiveX支持并重新编译.如果您想阻止代码加载这些额外的页面,您可以使用下面的代码给出响应,而无需从Web下载.

WebClient browser;
browser.setWebConnection(new WebConnectionWrapper(browser) {
    @Override
    public WebResponse getResponse(final WebRequest request) throws IOException {
        if (/* Perform a test here */) {
            return super.getResponse(request); // Pass the responsibility up.
        } else {
            /* Give the program a response, but leave it empty. */
            return new StringWebResponse("", request.getUrl());
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

我注意到的其他事情:

  • HTMLUnit不是线程安全的,这意味着您应该为每个线程创建一个新的线程.
  • HTMLUnit实际上会缓存页面