I'm trying to read bytes from input-stream and it much slower than reading chars with reader. I can't figure out why it is so. Look at the test:
(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"
As far as I know clojure.java.io/input-stream uses BufferedInputStream and clojure.java.io/reader uses BufferedReader so there no reason to so dramatical difference in speed. Do I miss something?
r2is correct? Didn't you use.readLinethere? (testing if the result is falsy instead of comparing it to -1 would indicate it)