I managed to get another 2.5x improvement with this function:

function calc_net( d::Int64, t::Int64, i::Int64, sim::Dict, param::Dict )

  # name some things
  gamma = param["gamma"]
  o_vec = param["o_vec"]
  numO = length(o_vec)
  w0 = sim["w"][d, 1, i]

  # retrieve some history
  b_hist = reshape(sim["b"][d, 1:t, i, :], t, 3)
  b_hist_col2 = reshape(sim["b"][d, 1:t, i, 2], t, 1)

  numB = length(b_hist[:,1])
  b_hist_col2_A = zeros(numB,1)
  b_hist_col2_B = zeros(numB,1)
  for j = 1:numB
      b_hist_col2_A[j] = b_hist_col2[j] * (b_hist[j,1] == 65)
      b_hist_col2_B[j] = b_hist_col2[j] * (b_hist[j,1] == 66)
  end

  # -----------------------------------------------------------------------
  # sum some stuff according to some conditions
  b_A_su_ = zeros(numO, 1)
  b_B_su_ = zeros(numO, 1)
  b_A_pu_ = zeros(numO, 1)
  b_B_pu_ = zeros(numO, 1)

  for idx = 1:numO

    o = o_vec[idx]

    for j in 1:numB
        if o < b_hist[j,3]
            if b_hist[j,1] == 65
                b_A_su_[idx] += b_hist_col2[j]
            end
        elseif o > b_hist[j,3]
            if b_hist[j,1] == 66
                b_B_su_[idx] += b_hist_col2[j]
            end
        else
            if b_hist[j,1] == 65
                b_A_pu_[idx] += b_hist_col2[j]
            end
            if b_hist[j,1] == 66
                b_B_pu_[idx] += b_hist_col2[j]
            end
        end
    end
  end # idx
  # -----------------------------------------------------------------------

  # get things in right dimensions for calculation below
  w0_ = repmat([w0], numO, 1)
  total_b_A_ = repmat([sum(b_hist_col2_A)], numO, 1)
  total_b_B_ = repmat([sum(b_hist_col2_B)], numO, 1)

  # calculate net
  net_ = w0_ - total_b_A_ - total_b_B_ + b_A_pu_ + b_B_pu_ +
    (1 + gamma) .* (b_A_su_ + b_B_su_)

  # temporarily impose minimum on values of net_
  net_ = max(net_, 0.1)

  # return output
  return net_

end


The most significant change is that I replaced the boolean operations with 
if-statements. This saves type conversion and possible a bit of memory 
allocation. AFAICT the main loop is as efficient as it can be, and this 
loop seems to dominate the execution time. So I'm not sure what other 
strategies are needed to realize the expected performance from Julia.

Cheers,
Daniel.


On Saturday, 19 September 2015 19:50:50 UTC+2, Adam wrote:
>
> Hi, I'm a novice to Julia but have heard promising things and wanted to 
> see if the language can help with a problem I'm working on. I have some 
> Matlab code with some user-defined functions that runs a simulation in 
> about ~1.4 seconds in Matlab (for a certain set of parameters that 
> characterize a small problem instance). I translated the code into Julia, 
> and to my surprise the Julia code runs 5x to 30x slower than the Matlab 
> code. I'll be running this code on much larger problem instances many, many 
> times (within some other loops), so performance is important here. 
>
> I created a GitHub gist that contains a stripped-down version of the Julia 
> code that gets as close to (as I can find) the culprit of the problem. The 
> gist is here: https://gist.github.com/anonymous/010bcbda091381b0de9e. A 
> quick description: 
>
>    - set_up.jl sets up parameters and other items.
>    - set_up_sim.jl sets up items particular to the simulation.
>    - simulation.jl runs the simulation.
>    - calc_net.jl, dist_o_i.jl, and update_w.jl are user-defined functions 
>    executed in the simulation. 
>
>
> On my laptop (running in Juno with Julia version 0.3.10), this code yields:
> elapsed time: 43.269609577 seconds (20297989440 bytes allocated, 38.77% gc 
> time)
> elapsed time: 38.500054653 seconds (20291872804 bytes allocated, 40.41% gc 
> time)
> elapsed time: 40.238907235 seconds (20291869252 bytes allocated, 39.44% gc 
> time)
>
> Why is so much memory used, and why is so much time spent in garbage 
> collection?
>
> I'm familiar with 
> http://docs.julialang.org/en/release-0.3/manual/performance-tips/ and 
> have tried to follow these tips to the best of my knowledge. One example of 
> what might be seen as low-hanging fruit: I tried removing the type 
> declarations from my functions, but this actually increased the run-time of 
> the code by a few seconds. Also, other permutations of the column orders 
> pertaining to D, T, and I led to slower performance. 
>
> I'm sure there are several issues at play here-- I'm just using Julia for 
> the first time. Any tips would be greatly appreciated. 
>

Reply via email to