- 
          
- 
                Notifications
    You must be signed in to change notification settings 
- Fork 5.7k
Closed
Labels
performanceMust go fasterMust go faster
Description
Using maximum with a function as first argument (or with a generator) can be 2 or 3 times slower than an explicit for loop, where intuitively they should take more or less the same time: see this comment on discourse.  Here I'm computing the maximum of the absolute value of elements in an array without allocating the intermediate abs.(v) array.
julia> v = randn(1000000);
julia> function maxabs(v)
       m = abs(v[1])
       for i in 2:length(v)
       z = abs(v[i])
       z>m && (m=z)
       end
       m
       end
maxabs (generic function with 1 method)
julia> @benchmark maxabs($v)
BenchmarkTools.Trial: 
  memory estimate:  0 bytes
  allocs estimate:  0
  --------------
  minimum time:     594.965 μs (0.00% GC)
  median time:      622.898 μs (0.00% GC)
  mean time:        633.162 μs (0.00% GC)
  maximum time:     1.057 ms (0.00% GC)
  --------------
  samples:          7867
  evals/sample:     1
julia> @benchmark maximum(abs, $v)
BenchmarkTools.Trial: 
  memory estimate:  0 bytes
  allocs estimate:  0
  --------------
  minimum time:     1.586 ms (0.00% GC)
  median time:      1.659 ms (0.00% GC)
  mean time:        1.682 ms (0.00% GC)
  maximum time:     2.718 ms (0.00% GC)
  --------------
  samples:          2968
  evals/sample:     1
julia> @benchmark maximum(abs(el) for el in $v)
BenchmarkTools.Trial: 
  memory estimate:  16 bytes
  allocs estimate:  1
  --------------
  minimum time:     1.482 ms (0.00% GC)
  median time:      1.504 ms (0.00% GC)
  mean time:        1.538 ms (0.00% GC)
  maximum time:     2.682 ms (0.00% GC)
  --------------
  samples:          3245
  evals/sample:     1
I'm on Julia 0.7, but the same issue appeared on Julia 0.6 (I have to note that the generator version improved between 0.6 and 0.7: in 0.6 it was slower than the function version, now they are comparable).
julia> versioninfo()
Julia Version 0.7.0-DEV.3634
Commit 8d8f960faa (2018-01-29 10:32 UTC)
Platform Info:
  OS: Linux (x86_64-linux-gnu)
  CPU: Intel(R) Core(TM) i7-7700HQ CPU @ 2.80GHz
  WORD_SIZE: 64
  LIBM: libopenlibm
  LLVM: libLLVM-3.9.1 (ORCJIT, skylake)
Environment:EDIT: the issue is about maximum, not about generators, see comments below. I've edited the title accordingly.
Metadata
Metadata
Assignees
Labels
performanceMust go fasterMust go faster