我想弄清楚是否有更快的方法从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代码这么慢?
答案 0 :(得分:7)
因为在你第一次从缓冲区读书时,你在第二次阅读时会逐行阅读。
Source.getLines不是作为IOUtils或其他任何库的银弹替代品,而是打算逐行阅读。你可以在Scala中完美地使用IOUtils。
答案 1 :(得分:1)
看看你的连接速度有多慢(在2到6分钟之间获得gizmodo),你可能会发现Scala和Java之间的阅读速度不是问题,而是一个不可靠的互联网连接。如果您确实想测试速度差异,请尝试从本地服务器提供文件,以便从等式中废弃互联网连接速度。
最后,对于高级HTTP客户端,我会查看Spray HTTP Client。 Spray是一个非常好的非阻塞(使用Actors)HTTP工具集。