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.
>