为什么Scala Source.fromURL比Apaches IOUtils慢?

时间:2013-01-10 02:30:07

标签: java scala io

我想弄清楚是否有更快的方法从URL使用Scala获取内容。使用Apache IOUtils我能够比Scala中的Source.fromURL更快地获取内容。以下是两者的代码:

使用Java:

    try {
        tmp=IOUtils.toString(new URL("http://gizmodo.com"));
        tmp=tmp.substring(tmp.indexOf("360\" title=")+12);
        tmp=tmp.substring(0,tmp.indexOf("\""));
    } catch (MalformedURLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

使用Scala:

  val gizmodoPageLines = Source.fromURL("http://gizmodo.com").getLines.mkString("\n")
  val pos=gizmodoPageLines.indexOf("360\" title=")
  var tmp=gizmodoPageLines.substring(pos+12)
  tmp.substring(0,tmp.indexOf("\""))

在Java中需要大约:155899 ns

在Scala中:343880 ns

为什么Scala代码这么慢?

2 个答案:

答案 0 :(得分:7)

因为在你第一次从缓冲区读书时,你在第二次阅读时会逐行阅读。

Source.getLines不是作为IOUtils或其他任何库的银弹替代品,而是打算逐行阅读。你可以在Scala中完美地使用IOUtils。

答案 1 :(得分:1)

看看你的连接速度有多慢(在2到6分钟之间获得gizmodo),你可能会发现Scala和Java之间的阅读速度不是问题,而是一个不可靠的互联网连接。如果您确实想测试速度差异,请尝试从本地服务器提供文件,以便从等式中废弃互联网连接速度。

最后,对于高级HTTP客户端,我会查看Spray HTTP Client。 Spray是一个非常好的非阻塞(使用Actors)HTTP工具集。