HtmlUnit比GUI浏览器慢?

时间:2012-05-21 19:49:11

标签: 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缓存?

3 个答案:

答案 0 :(得分:5)

回答你的问题:为什么它很慢:

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

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

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

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

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

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

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());
        }
    }
});

我注意到的其他事情:

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

答案 1 :(得分:1)

HTMLUnit需要更长时间的原因是每个请求都是逐个完成的。这是检索页面需要这么长时间的主要原因。 JS和CSS不应该对IMO产生很大影响

答案 2 :(得分:0)

WebClient对象维护静态资源的缓存。如果关闭WebClient对象并创建另一个对象,则必须重建缓存。

为避免这种情况,您可以跨多个会话重用WebClient对象,甚至可以维护WebClient对象池。另请参阅是否可以维护Cache对象。您可能希望在将WebClient的cookie返回池之前清除它。

正如@Lee指出的那样,WebConnectionWrapper为您提供了拦截的机会。我使用它来避免重定向,禁用所选资源的JS执行,或者如果我不关心该资源则返回模拟数据。