I've got an even faster version using memory-mapped file I/O. It also simplify the code a little bit.
(defn fast-read-file [#^String filename #^String charset] (with-open [cin (. (new FileInputStream filename) getChannel)] (let [size (. (new File filename) length) char-buffer (. ByteBuffer (allocate size)) decoder (. (. Charset (forName charset)) (newDecoder))] (str (. decoder (decode (.map cin (. FileChannel$MapMode READ_ONLY) 0 size))))))) On Windows I get these results: nio=> (time (dotimes [i 1000] (fast-read-file ".emacs" "ISO-8859-1"))) "Elapsed time: 247.9453 msecs" nio=> (time (dotimes [i 1000] (fast-read-file ".emacs" "ISO-8859-1"))) "Elapsed time: 247.666881 msecs" nio=> (time (dotimes [i 1000] (fast-read-file ".emacs" "ISO-8859-1"))) "Elapsed time: 247.895424 msecs" Compared with the previous version with buffer size equal to the length of the file: nio=> (time (dotimes [i 1000] (read-file ".emacs" "ISO-8859-1" (. (new File ".emacs") length)))) "Elapsed time: 264.470276 msecs" nio=> (time (dotimes [i 1000] (read-file ".emacs" "ISO-8859-1" (. (new File ".emacs") length)))) "Elapsed time: 265.775947 msecs" nio=> (time (dotimes [i 1000] (read-file ".emacs" "ISO-8859-1" (. (new File ".emacs") length)))) "Elapsed time: 263.828204 msecs" The API documentation for the map method aren't very exhaustive, there's not much information on its limits. A lot of details are implementation dependent and left unspecified, most problems though seems to be related to writing. --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en -~----------~----~----~----~------~----~------~--~---