1

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

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

使用斯卡拉:

  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 代码这么慢?

4

2 回答 2

7

因为在您的第一个中您正在从缓冲区中读取,而在您的第二个中您正在逐行读取。

Source.getLines 不打算作为 IOUtils 或任何其他库的灵丹妙药替代品,它旨在逐行阅读。你可以在 Scala 中完美地使用 IOUtils。

于 2013-01-10T02:46:51.640 回答
1

看看你的连接有多慢(获得 gizmodo 需要 2 到 6 分钟),你可能会发现 Scala 和 Java 之间的读取速度不是问题,而是互联网连接不可靠。如果您真的想测试速度差异,请尝试从本地服务器提供文件,这样您就可以从等式中删除互联网连接速度。

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

于 2013-01-10T05:52:52.527 回答