with a long counter it needs slightly longer (216 microseconds in average instead of 196)!
any other ideas?

On 02/07/13 19:11, Leon Barrett wrote:
Try longs instead of ints? Clojure doesn't support local ints, so you may be casting longs to ints a lot.


On Tue, Jul 2, 2013 at 11:05 AM, Jim - FooBar(); <jimpil1...@gmail.com <mailto:jimpil1...@gmail.com>> wrote:

    I'm really sorry for coming back to this but even after everything we
    learned I'm still not able to get performance equal to java in a
    simple
    factorial benchmark. I'd like to think that I'm doing all the correct
    things to keep the comparison fair...observe this:

    benchmarks.core=> (crit/bench (jf! 50))
    WARNING: Final GC required 2.3432463351555 % of runtime
    Evaluation count : 311580 in 60 samples of 5193 calls.
                 Execution time mean : 196.444969 µs
        Execution time std-deviation : 10.637274 µs
       Execution time lower quantile : 194.356268 µs ( 2.5%)
       Execution time upper quantile : 197.042127 µs (97.5%)
                       Overhead used : 258.723396 ns

    Found 9 outliers in 60 samples (15.0000 %)
            low-severe       2 (3.3333 %)
            low-mild         7 (11.6667 %)
     Variance from outliers : 40.1247 % Variance is moderately inflated by
    outliers nil

    now java:

    benchmarks.core=> (crit/bench (.factorial ^Benchmarks
    (Benchmarks.) 50))
    WARNING: Final GC required 2.656271755497413 % of runtime
    Evaluation count : 562260 in 60 samples of 9371 calls.
                 Execution time mean : 107.148989 µs
        Execution time std-deviation : 1.650542 µs
       Execution time lower quantile : 106.504235 µs ( 2.5%)
       Execution time upper quantile : 108.934066 µs (97.5%)
                       Overhead used : 258.723396 ns

    Found 5 outliers in 60 samples (8.3333 %)
            low-severe       1 (1.6667 %)
            low-mild         4 (6.6667 %)
     Variance from outliers : 1.6389 % Variance is slightly inflated by
    outliers

    can you spot any differences with this code that would justify needing
    almost twice as much time?

    (defn jf!  "Calculate factorial of n as fast as Java without
    overflowing." [n]
     (loop [i (int n)
               ret 1N]
     (if (== 1 i) ret
     (recur (dec i) (* ret i)))))

    now java:

      public BigInteger factorial(final int n){
        BigInteger res = BigInteger.valueOf(1L); //build upresult
               for (int i = n; i > 1; i--)
                   res = res.multiply(BigInteger.valueOf(i));
              return res;
       }

    I know this is getting ridiculous but I'm preparing a presentation and
    I was sort of counting on this example...Of course, it goes without
    saying that I'm using unchecked-math and :jvm-opts ^replace[] .


    am I doing something wrong?

    thanks for your time

    Jim



    On Fri, 14 Jun 2013 00:11:52 -0700 (PDT)
    Jason Wolfe <ja...@w01fe.com <mailto:ja...@w01fe.com>> wrote:

        Thanks for your response.  I attempted to answer this in my
        clarification, but our goal is to attack this 'general advice' and
        make it possible to get the same speed for array handling in
        natural-seeming Clojure without writing Java.  In particular,
        we want
        to create macros that make it easy to achieve maximum
        performance by
        putting *your code* for manipulating array elements in the
        middle of
        an optimized loop, and this can't be done easily at the
        library level
        (as far as I can see) by dropping to Java, since in Java your code
        would always have to be wrapped in a method invocation with
        corresponding performance implications.

        Our previous version of this library (developed for Clojure 1.2,
        IIRC) was able to get within 0-30% or so of raw Java speed while
        providing a clean Clojure interface, and we're trying to get
        back to
        this point with Clojure 1.5 so we can release it as
        open-source for
        everyone to use.

        -Jason

        On Friday, June 14, 2013 12:04:12 AM UTC-7, Glen Mailer wrote:
        >
        > This doesn't really answer your question directly, but is
        there a
        > reason you need to keep this in clojure, or are you just
        aiming to
        > establish why this is happening?
        >
        > My understanding was that for performance critical code the
        general
        > advice is to drop down to raw java?
        >
        > Glen
        >
        >


-- -- 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
    <mailto: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
    <mailto:clojure%2bunsubscr...@googlegroups.com>
    For more options, visit this group at
    http://groups.google.com/group/clojure?hl=en
    --- You received this message because you are subscribed to a
    topic in the Google Groups "Clojure" group.
    To unsubscribe from this topic, visit
    https://groups.google.com/d/topic/clojure/LTtxhPxH_ws/unsubscribe.
    To unsubscribe from this group and all its topics, send an email
    to clojure+unsubscr...@googlegroups.com
    <mailto:clojure%2bunsubscr...@googlegroups.com>.
    For more options, visit https://groups.google.com/groups/opt_out.



--
--
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
---
You received this message because you are subscribed to the Google Groups "Clojure" group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.



--
--
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
--- You received this message because you are subscribed to the Google Groups "Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to