【发布时间】:2017-03-16 16:01:41
【问题描述】:
我正在尝试从输入流中读取字节,它比使用阅读器读取字符慢得多。我不明白为什么会这样。看测试:
(defn r1
[input]
(loop []
(when-not (= -1 (.read ^java.io.InputStream input))
(recur))))
(defn r2
[input]
(loop []
(when-not (.read input)
(recur))))
(dotimes [_ 10]
(time (with-open [is (clojure.java.io/input-stream "15mb.log")]
(r1 is))))
"Elapsed time: 111.608991 msecs"
"Elapsed time: 95.45663 msecs"
"Elapsed time: 148.789867 msecs"
"Elapsed time: 97.580527 msecs"
"Elapsed time: 113.093759 msecs"
"Elapsed time: 108.306019 msecs"
"Elapsed time: 107.71069 msecs"
"Elapsed time: 104.833343 msecs"
"Elapsed time: 174.701027 msecs"
"Elapsed time: 141.969629 msecs"
(dotimes [_ 10]
(time (with-open [r (clojure.java.io/reader "15mb.log")]
(r2 r))))
"Elapsed time: 0.635769 msecs"
"Elapsed time: 0.422315 msecs"
"Elapsed time: 0.355953 msecs"
"Elapsed time: 0.336128 msecs"
"Elapsed time: 0.333523 msecs"
"Elapsed time: 0.339613 msecs"
"Elapsed time: 0.329693 msecs"
"Elapsed time: 0.234213 msecs"
"Elapsed time: 0.209742 msecs"
"Elapsed time: 0.199334 msecs"
据我所知,clojure.java.io/input-stream 使用 BufferedInputStream 并且 clojure.java.io/reader 使用 BufferedReader,因此没有理由在速度上有如此巨大的差异。我错过了什么吗?
【问题讨论】:
-
您确定您的
r2正确吗?你不是在那里用.readLine吗? (测试结果是否虚假而不是将其与 -1 进行比较将表明它) -
是的,r2 不正确。谢谢。
标签: java performance clojure inputstream reader