[erlang-questions] Erlang shows its slow face!
Edmond Begumisa
ebegumisa@REDACTED
Wed Nov 17 16:00:29 CET 2010
Aaaahhh,
> The compiler *could* make a special case of lists:seq/[2,3]
> and generate
>
> <foo>(1, N, ...)
>
> But it doesn't.
OK. I erroneously thought that this *was* the case.
> The compiler can't inline the definition and
> use whether it is now, because it's a remote call (even
> if -imported), so it might change at run time.
I see it now :)
- Edmond -
On Wed, 17 Nov 2010 16:45:09 +1100, Richard O'Keefe <ok@REDACTED>
wrote:
>
> On 17/11/2010, at 4:34 AM, Edmond Begumisa wrote:
>
>> On Wed, 17 Nov 2010 01:20:51 +1100, Kostis Sagonas <kostis@REDACTED>
>> wrote:
>>
>>> There are two basic issues here:
>>> (1) The Erlang compiler doesn't really handle list comprehension as
>>> native loops; it compiles list comprehensions to recursive
>>> functions. lists:seq(1, N) is not special syntax -- unlike Haskell
>>> --
>>> and almost surely builds an actual list.
>>> Yes. This is an issue. Actually, it's more general: in my experience
>>> most Erlang programmers do not understand the difference between list
>>> comprehensions and lists:foreach/2. Many of them find list
>>> comprehension notation so nice that they often use it in places where
>>> building the list is not only is not their intention but is completely
>>> unnecessary.
>>> The compiler is not sufficiently clever to perform deforestation and
>>> avoid construction of intermediate lists.
>>>
>>
>> First I'm hearing of this. It really ought to be in one of those green
>> boxes in the documentation.
>
> Let's go around this one more time.
>
> The current Erlang compiler turns
>
> [f(X) || X <- lists:seq(1, N)]
>
> into
> <foo>(lists:seq(1, N), ...)
> where
> <foo>
> is a function generated by the compiler.
>
> The compiler *could* make a special case of lists:seq/[2,3]
> and generate
>
> <foo>(1, N, ...)
>
> But it doesn't. The actual definition of lists:seq/2 not
> only *could* change, in the not too distant past it *has*
> changed. The compiler can't inline the definition and
> use whether it is now, because it's a remote call (even
> if -imported), so it might change at run time.
>
> Haskell compilers and the Mercury compiler *do* perform
> deforestation because they are given an unchanging program
> to work with and can safely do cross-module inlining.
> Erlang can't.
>
> This would be a potentially serious problem if iterating
> over integer ranges were something Erlang spent a lot of
> time doing.
>
> I just checked an Erlang/OTP release I keep handy for such
> things.
> ~ 1,500,000 raw lines
> ~ 950,000 SLOW
> 34 list:seq iterations
> 18 in two EUNIT tests
> 3 in other test cases (at least)
> 13 list:seq not in an ?_assert
> ~ 3200 Pat <- Exp
>
> The unit tests don't matter for performance. We're left
> with about one SLOC in every 72,000 being an iteration of
> this kind, or about <- in every 250 being an integer
> iteration.
>
> The Erlang/OTP team probably feel they have other maddened
> grizzly bears to stun before they bother with something that
> seems to turn up mainly in toy benchmarks, and who could blame them?
>
>
> ________________________________________________________________
> erlang-questions (at) erlang.org mailing list.
> See http://www.erlang.org/faq.html
> To unsubscribe; mailto:erlang-questions-unsubscribe@REDACTED
>
--
Using Opera's revolutionary e-mail client: http://www.opera.com/mail/
More information about the erlang-questions
mailing list