<div dir="ltr"><div>I don't want to cause a firestore here but I was doing some simple benchmarks on file i/o between Java, ABCL, and SBCL and I'm a bit shocked, honestly.</div><div><br></div><div>Reading a 2.5M file in 16M chunks in (using iso-8859-1):</div><div>- abcl takes a tad over 1 second</div><div>- sbcl takes 0.04 seconds</div><div><br></div><div>Reading a 5.8G file in 16M chunks in (using iso-8859-1 for Lisp, for Java it's just bytes):</div><div>- abcl takes...too long, I gave up</div><div>- sbcl takes between 20 and 21 seconds</div><div>- Java takes 1.5 seconds</div><div><br></div><div>These are all run on the same computer using the same files, etc.<br></div><div><br></div><div>What's up with this?  Thoughts?  I'd heard that SBCL should be as fast as C under at least some circumstances.  I'd wager that C is at least as fast as Java (probably faster).<br></div><div><br></div><div>Thanks,</div><div>Garrett Dangerfield. (he/him/his)<br></div><div><br></div><div>P.S. Don't get me wrong, I *LOVE* Lisp, I'm trying to get away from Java as fast as I can (the syntax is killing me slowly).  I've used ABCL in projects before (it was wonderful, Java doesn't handle XML well).<br></div><div><br></div><div>Lisp code:</div><div>  (with-open-file (stream "/media/danger/OS/temp/jars.txt" :external-format :iso-8859-1) ; great_expectations.iso<br>               (let ((size (file-length stream))<br>                  (buffer-size (* 16 1024 1024)) ; 16M<br>                  )<br>   (time<br>              (loop with buffer = (make-array buffer-size :element-type 'character)<br>                         for n-characters = (read-sequence buffer stream)<br>                     while (< 0 n-characters)))<br>   )))<br></div><div><br></div><div>Java code:</div><div>                  private static final int BUFFER_SIZE = 16 * 1024 * 1024;<br>try (InputStream in = new FileInputStream("/media/danger/OS/temp/great_expectations.iso"); ) {<br>                    byte[] buff = new byte[BUFFER_SIZE];<br>                  int chunkLen = -1;<br>                    long start = System.currentTimeMillis();<br>                      while ((chunkLen = in.read(buff)) != -1) {<br>                            System.out.println("chunkLen = " + chunkLen);<br>                       }<br>                     double duration = System.currentTimeMillis() - start;<br>                 duration /= 1000;<br>                     System.out.println(String.format("it took %,2f secs", duration));<br>           } catch (Exception e) {<br>                       e.printStackTrace(System.out);<br>                } finally {<br>                   System.out.println("Done.");<br>                }</div><div><br></div></div>