Я пытаюсь читать байты из потока ввода, и это намного медленнее, чем чтение символов с помощью считывателя. Я не могу понять, почему это так. Посмотрите на тест:
(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 укажет на это) - person Piotrek Bzdyl   schedule 16.03.2017