On Feb 24, 2013, at 8:46 AM, Marko Topolnik wrote:
> On Sunday, February 24, 2013 2:50:01 PM UTC+1, bernardH wrote:
> FWIW, I, for one, am really glad that Clojure allows us to select precisely
> which nice tools we want (have to) throw away (persistent data structures,
> dynamic typing, synchronized) when the need arises. Reminds me of the "don't
> pay for what you don't use" motto of C++ except done right (i.e. the other
> way around, because you don't want to pay wrt simplicity rather than
> performance, cf. "premature optimization…")
>
> Don't you think that the real goal is to have performant idiomatic code? That
> was certainly the aim of the Common Lisp community of the '80s and, from what
> I hear, idiomatic Haskell is a performance devil as well. Static typing isn't
> just about type safety, after all; it's also about performance. When the
> compiler knows everything about your code, it has a much easier time
> producing killer machine code.
For both Common Lisp and Haskell, the most straightforward code you would
typically write for many problems allocates more memory than code specifically
written to avoid allocating memory, and if other things are equal (which they
often aren't), code that allocates less memory can be faster.
At least for Common Lisp, it can often generate faster code with appropriate
type declarations, especially for arithmetic.
Take a look at any of the Common Lisp or Haskell submissions to the Computer
Language Benchmarks Game web site, and you will see some programs that are
nowhere near what people typically write in those languages, and certainly not
what people would write if they weren't concerned with squeezing out the last
drop of performance. Lots of mutable data structures in both, and lots of type
declarations in Common Lisp.
Common Lisp (SBCL) vs Java
http://benchmarksgame.alioth.debian.org/u64q/lisp.php
Haskell vs. Java http://benchmarksgame.alioth.debian.org/u64q/haskell.php
Then again, even for C and Java programs on that site, people will do some
pretty amazing tricks they wouldn't normally do in those languages, either,
e.g. performing I/O in parallel with computation, even when it makes the
computation code more complex to give the correct answer.
For Clojure, I'd recommend doing the same thing I'd recommend in just about any
language: write the code that occurs to you first to get it correct. If it is
fast enough for your purposes, whatever those are, you are done. If not, use a
profiler to see where most of the time is spent, and then start working on
optimizations in the same language if they are worth your time to do so. If
they get too difficult in the original language, dropping down to a lower-level
language (e.g. Java, C, assembler) is often a choice you can make, depending
upon your deployment restrictions.
Andy
--
--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
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
---
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 [email protected].
For more options, visit https://groups.google.com/groups/opt_out.