【问题标题】:Clojure: input-stream slower than readerClojure:输入流比阅读器慢
【发布时间】: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


【解决方案1】:

您的测试有缺陷。 BufferedReaderBufferedInputStream 在流的末尾返回 -1。所以,你对r2 的测试也应该是(when-not (= -1 (.read ...

虽然下面的测试方法不能精确到非常小的毫秒级,但对于这个测试来说已经足够准确了,并且使用非常好的 clojure 标准基准库进行的测试会产生类似的结果。更紧凑地再次发布测试,以便于复制/粘贴:

(let [testfile "zerofile"]    ; $ dd if=/dev/zero of=zerofile bs=1k count=1k
  (map (fn [func label]
         (println label)
         (dotimes [_ 3]
           (time (with-open [data (func testfile)]
                   (while (not= -1 (.read data)))))))
    [clojure.java.io/input-stream,  clojure.java.io/reader]
    ["Input Stream:" "\nReader:"]))

一个结果:

Input Stream:
"Elapsed time: 624.01494 msecs"
"Elapsed time: 650.407183 msecs"
"Elapsed time: 627.244097 msecs"

Reader:
"Elapsed time: 706.776733 msecs"
"Elapsed time: 691.887275 msecs"
"Elapsed time: 703.918226 msecs"

【讨论】:

  • 感谢您的帮助,我现在明白了。在我的示例中,我很快就退出了一个读者。
猜你喜欢
  • 2014-10-31
  • 2011-09-19
  • 2017-08-21
  • 2012-05-03
  • 1970-01-01
  • 2016-02-25
  • 2012-08-07
  • 1970-01-01
  • 2013-06-30
相关资源
最近更新 更多