Here's my second attempt.  I fixed one obvious bug but it was the
addition of the type "#^ByteBuffer" that made a *huge* difference.

The times now look something like:

;;;; Compile file /home/aim/src/clojure/foo.clj ...
"Elapsed time: 64.273962 msecs"
"Elapsed time: 59.607317 msecs"
"Elapsed time: 61.639253 msecs"
"Elapsed time: 61.495916 msecs"
"Elapsed time: 61.805888 msecs"

    (import '(java.io File))
    (import '(java.nio ByteBuffer))
    (import '(java.nio MappedByteBuffer))
    (import '(clojure.contrib))
    (import '(clojure.contrib.mmap))

    (require 'clojure.contrib.mmap)

    (def my-file (File. "/home/aim/largelog.bin"))
    (def my-buff (mmap my-file))

    (defn my-iterate-map [f #^ByteBuffer buf]
      (let [max (long (.length f))]
        (.position buf 0)
        (loop [i (long 1)]
          ;;(println i)
          (if (< i (long max))
            (do
              (.get buf)
              (recur (unchecked-inc i))))))
      buf)

    (dotimes [_ 5] (time (my-iterate-map my-file my-buff)))


On Nov 19, 1:14 pm, aim <[EMAIL PROTECTED]> wrote:
> Hi,
>
> I was experimenting with using mmap from clojure but I see vastly
> different timings when compared to plain old Java and
> MappedByteBuffer.
>
> Here's my code and also represents the largest bit of clojure I have
> written:
>
>   (import '(java.io File))
>
>   (use 'clojure.contrib.mmap)
>
>   (def my-file (File. "/home/aim/largelog.bin"))
>
>   (defn my-iterate-map [buf]
>     (let [max (.remaining buf)]
>       (loop [i (long 1)]
>         (if (< i max)
>           (do (.get buf)
>               (recur (unchecked-inc i))))))
>     buf)
>
>   (time (my-iterate-map (mmap my-file)))
>
> The results I see from clojure are:
>
>   ;;;; (time (my-iterate-map (mmap my-file))) ...
>   "Elapsed time: 113191.133057 msecs"
>
> But If I do the same thing in Java I get:
>
>   gone in 0.0540 seconds!
>
> Is there something I can do to make the clojure version near or
> equivalent to the java code below?
>
> Thanks,
> Andy.
>
> --- Java code --
>
> import java.io.File;
> import java.io.FileInputStream;
> import java.nio.ByteBuffer;
> import java.nio.channels.FileChannel;
>
> public class Main {
>         public static void main(String[] args) throws Exception {
>                 File f = new File(args[0]);
>                 FileInputStream fis = new FileInputStream(f);
>                 ByteBuffer buf = 
> fis.getChannel().map(FileChannel.MapMode.READ_ONLY,
> 0, f.length());
>                 long then = System.currentTimeMillis();
>                 long sum = 0;
>                 while (buf.hasRemaining()) {
>                         sum += (buf.get() & 0xFF);
>                 }
>                 long now = System.currentTimeMillis();
>                 System.out.printf("gone in %.4f seconds!\n", (((now - then) /
> 1000.0)));
>         }
>
> }
--~--~---------~--~----~------------~-------~--~----~
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
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/clojure?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to