It depends on your workload and use-cases, and you could fill many
textbooks with a discussion of the tradeoffs, but I can think of some rules
of thumb that point in clojure's favor.

The most essential metric for me to see has been Amdahl's Law:
http://en.wikipedia.org/wiki/File:AmdahlsLaw.svg

To summarize it, "The speedup of a program using multiple processors in
parallel computing is limited by the time needed for the sequential
fraction of the program."

My observation is that 'the program' can be replaced by 'the system'.
 Memory and cpu are sort of like space/time duality, but not 100% either
way, since you can see with caches and latency that memory usage has time
implications, and cpu performance relies on registers and things.

For example, in a shared memory system, the parallelization of the cache
coherence protocol of the hardware can dominate performance aspects of your
software once your software's 'good enough', thus I'd argue the protocol
itself becomes part of the 'sequential fraction' of the system and program
and subject to Amdahl's law.

When this sort of thing happens often enough, programmers write code that
takes away control from this aspect of the system and does things manually,
since the programmers have better knowledge of the system than the CPU or
compiler ever will.  Switching to a message-passing algorithm might be the
way to do it in this case, manually overriding data sent between cores,
accepting the overhead of data copies and such along the way.

Consider core.async, I think it's a great example of a thread scheduler and
set of abstractions to overcome the limitations of OS-provided threads,
schedulers, the control offered by them, and the backlash against code
written to them.  It's useful because the scenarios it addresses are common
enough now that we need to give ourselves back the control that was taken
away by OS's in the first place.

Core.async is implemented by thread-pools, which I can consider a
subsection and delineation of a common set of resources for a specific
usage, similarly it's common in game-dev and I imagine other fields to use
memory-pools to offer predictable or better performance and things like
instrumentation.

But, I would argue that the greatest hindrance to writing the systems we
want is actually programmer productivity.  Taken to an extreme, why
wouldn't we write our own OS's and kernels on bare-metal, in ASM or C every
time instead of re-using anything?  It's because the tradeoffs that are
offered by reusing different subsystems are well-understood and convenient,
or anything else is impractical/impossible.

By picking C++ over Clojure/Java for these reasons you're effectively
saying (which might be true) that the difficulty of optimization and the
need for manual control is more important than all of the benefits(minus
drawbacks) afforded by a higher-level system.

So, it's possible to improve memory-locality in clojure and java, people do
it all the time.  The java memory model is not a giant leap away from
x86/64 and there are ways to avoid being subject to the garbage collector
if you want it.

This blog is a great resource: http://mechanical-sympathy.blogspot.com/

I think clojure's value-add in the big-picture of performance and
parallelism is effective high-level coding, at-least-as-good-as-java
low-level coding, and the ease of traversing those abstraction levels in a
unified way.

By default, you're getting immutable and functional code and the
implications of clojure's relative ease/difficulty tradeoffs.


On Wed, Jan 1, 2014 at 8:59 PM, Mark P <pierh...@gmail.com> wrote:

> I have watched a number of clojure talks where the concurrent programming
> benefits of Clojure are emphasized.  People have suggested that the number
> of cores in computers is growing with an exponential trend.  Software
> developers will need programming techniques (eg immutable functional
> programing) which allow full harnessing of this.  Software that doesn't
> utilize the cores will not perform well and will be left behind.
>
> But I have heard counter arguments to this view of the future...
>
>    1. The number of cores isn't growing very fast.
>       - There isn't much demand for more cores, so this growth will be
>       very slow for most computer devices.
>       2. Memory performance is the key at this time.
>       - Whereas raw CPU speed previously was growing dramatically for
>       many years, this has never been true for memory speed.  As a result, 
> memory
>       access accounts for a high percentage of execution time in modern 
> software.
>       - The key to writing performant software at this time (and for many
>       years to come) is to concentrate primarily on good memory performance.
>        This means...
>          - Keep memory footprint of programs small.
>          - Use various techniques to minimize cache misses.
>       - I have heard claims that dramatic program performance
>       improvements may be achieved by concentrating on these memory
>       considerations.
>       - It is claimed that for the next 5 or 10 years, there will be much
>       more performance yield to be had by concentrating on memory 
> optimizations,
>       than to concentrate on growth in the number of CPU cores for 
> performance.
>       - Yes utilize the multiple cores where appropriate, but only in
>       simple ways.  More focus should be given to performant memory usage 
> within
>       each thread, than worrying about deeply entwined multi-threaded 
> programming.
>       - Languages like C/C++ allow for good memory optimizations much
>       better than Java.  And in Clojure, it sounds like it is harder again.
>
> There is a lot that I like about Clojure, but is it unsuitable for
> software where performance will be important into the future?
>
> Or will the increase in multi-core capabilities soon mean that memory
> performance limitations pale into insignificance compared with the
> computational gains achieved through Clojure techniques for effectively
> utilizing many cores?
>
> Or is it possible to improve memory performance (eg reduce cache misses)
> within Clojure?
>
> Thanks,
>
> Mark P.
>
>  --
> --
> 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