Hi, I have a question about how to reduce the allocations for long expressions, here is my example
function rel(a, b, c, f, delta, ZB, s, t0, y0)
term = 0.0
for i = 1:length(s)
term += s[i] * (f[1, 1] * a[i] * exp(1im * (delta[i, 1] + ZB[1]) * t0) * conj(y0[89]) + f[2, 1] * b[i] * exp(1im * (delta[i, 2] + ZB[1]) * t0) * conj(y0[93]) + f[3, 1] * c[i] * exp(1im * (delta[i, 3] + ZB[1]) * t0) * conj(y0[97]) + f[4, 1] * b[i] * exp(1im * (delta[i, 4] + ZB[1]) * t0) * conj(y0[101]) + f[5, 1] * c[i] * exp(1im * (delta[i, 5] + ZB[1]) * t0) * conj(y0[105]) + f[6, 1] * b[i] * exp(1im * (delta[i, 6] + ZB[1]) * t0) * conj(y0[109]) + f[7, 1] * a[i] * exp(1im * (delta[i, 7] + ZB[1]) * t0) * conj(y0[113]) + f[9, 1] * c[i] * exp(1im * (delta[i, 9] + ZB[1]) * t0) * conj(y0[121]) + f[10, 1] * b[i] * exp(1im * (delta[i, 10] + ZB[1]) * t0) * conj(y0[125]) + f[11, 1] * a[i] * exp(1im * (delta[i, 11] + ZB[1]) * t0) * conj(y0[129]) +
conj(f[1, 1] * a[i]) * exp(-1im * (delta[i, 1] + ZB[1]) * t0) * y0[89] + conj(f[2, 1] * b[i]) * exp(-1im * (delta[i, 2] + ZB[1]) * t0) * y0[93] + conj(f[3, 1] * c[i]) * exp(-1im * (delta[i, 3] + ZB[1]) * t0) * y0[97] + conj(f[4, 1] * b[i]) * exp(-1im * (delta[i, 4] + ZB[1]) * t0) * y0[101] + conj(f[5, 1] * c[i]) * exp(-1im * (delta[i, 5] + ZB[1]) * t0) * y0[105] + conj(f[6, 1] * b[i]) * exp(-1im * (delta[i, 6] + ZB[1]) * t0) * y0[109] + conj(f[7, 1] * a[i]) * exp(-1im * (delta[i, 7] + ZB[1]) * t0) * y0[113] + conj(f[9, 1] * c[i]) * exp(-1im * (delta[i, 9] + ZB[1]) * t0) * y0[121] + conj(f[10, 1] * b[i]) * exp(-1im * (delta[i, 10] + ZB[1]) * t0) * y0[125] + conj(f[11, 1] * a[i]) * exp(-1im * (delta[i, 11] + ZB[1]) * t0) * y0[129] +
f[1, 2] * b[i] * exp(1im * (delta[i, 1] + ZB[2]) * t0) * conj(y0[90]) + f[2, 2] * c[i] * exp(1im * (delta[i, 2] + ZB[2]) * t0) * conj(y0[94]) + f[4, 2] * c[i] * exp(1im * (delta[i, 4] + ZB[2]) * t0) * conj(y0[102]) + f[6, 2] * c[i] * exp(1im * (delta[i, 6] + ZB[2]) * t0) * conj(y0[110]) + f[7, 2] * b[i] * exp(1im * (delta[i, 7] + ZB[2]) * t0) * conj(y0[114]) + f[10, 2] * c[i] * exp(1im * (delta[i, 10] + ZB[2]) * t0) * conj(y0[126]) + f[11, 2] * b[i] * exp(1im * (delta[i, 11] + ZB[2]) * t0) * conj(y0[130]) + f[12, 2] * a[i] * exp(1im * (delta[i, 12] + ZB[2]) * t0) * conj(y0[134]) +
conj(f[1, 2] * b[i]) * exp(-1im * (delta[i, 1] + ZB[2]) * t0) * y0[90] + conj(f[2, 2] * c[i]) * exp(-1im * (delta[i, 2] + ZB[2]) * t0) * y0[94] + conj(f[4, 2] * c[i]) * exp(-1im * (delta[i, 4] + ZB[2]) * t0) * y0[102] + conj(f[6, 2] * c[i]) * exp(-1im * (delta[i, 6] + ZB[2]) * t0) * y0[110] + conj(f[7, 2] * b[i]) * exp(-1im * (delta[i, 7] + ZB[2]) * t0) * y0[114] + conj(f[10, 2] * c[i]) * exp(-1im * (delta[i, 10] + ZB[2]) * t0) * y0[126] + conj(f[11, 2] * b[i]) * exp(-1im * (delta[i, 11] + ZB[2]) * t0) * y0[130] + conj(f[12, 2] * a[i]) * exp(-1im * (delta[i, 12] + ZB[2]) * t0) * y0[134] +
f[1, 3] * a[i] * exp(1im * (delta[i, 1] + ZB[3]) * t0) * conj(y0[91]) + f[2, 3] * b[i] * exp(1im * (delta[i, 2] + ZB[3]) * t0) * conj(y0[95]) + f[3, 3] * c[i] * exp(1im * (delta[i, 3] + ZB[3]) * t0) * conj(y0[99]) + f[4, 3] * b[i] * exp(1im * (delta[i, 4] + ZB[3]) * t0) * conj(y0[103]) + f[5, 3] * c[i] * exp(1im * (delta[i, 5] + ZB[3]) * t0) * conj(y0[107]) + f[6, 3] * b[i] * exp(1im * (delta[i, 6] + ZB[3]) * t0) * conj(y0[111]) + f[7, 3] * a[i] * exp(1im * (delta[i, 7] + ZB[3]) * t0) * conj(y0[115]) + f[9, 3] * c[i] * exp(1im * (delta[i, 9] + ZB[3]) * t0) * conj(y0[123]) + f[10, 3] * b[i] * exp(1im * (delta[i, 10] + ZB[3]) * t0) * conj(y0[127]) + f[11, 3] * a[i] * exp(1im * (delta[i, 11] + ZB[3]) * t0) * conj(y0[131]) +
conj(f[1, 3] * a[i]) * exp(-1im * (delta[i, 1] + ZB[3]) * t0) * y0[91] + conj(f[2, 3] * b[i]) * exp(-1im * (delta[i, 2] + ZB[3]) * t0) * y0[95] + conj(f[3, 3] * c[i]) * exp(-1im * (delta[i, 3] + ZB[3]) * t0) * y0[99] + conj(f[4, 3] * b[i]) * exp(-1im * (delta[i, 4] + ZB[3]) * t0) * y0[103] + conj(f[5, 3] * c[i]) * exp(-1im * (delta[i, 5] + ZB[3]) * t0) * y0[107] + conj(f[6, 3] * b[i]) * exp(-1im * (delta[i, 6] + ZB[3]) * t0) * y0[111] + conj(f[7, 3] * a[i]) * exp(-1im * (delta[i, 7] + ZB[3]) * t0) * y0[115] + conj(f[9, 3] * c[i]) * exp(-1im * (delta[i, 9] + ZB[3]) * t0) * y0[123] + conj(f[10, 3] * b[i]) * exp(-1im * (delta[i, 10] + ZB[3]) * t0) * y0[127] + conj(f[11, 3] * a[i]) * exp(-1im * (delta[i, 11] + ZB[3]) * t0) * y0[131] +
f[2, 4] * a[i] * exp(1im * (delta[i, 2] + ZB[4]) * t0) * conj(y0[96]) + f[3, 4] * b[i] * exp(1im * (delta[i, 3] + ZB[4]) * t0) * conj(y0[100]) + f[4, 4] * a[i] * exp(1im * (delta[i, 4] + ZB[4]) * t0) * conj(y0[104]) + f[5, 4] * b[i] * exp(1im * (delta[i, 5] + ZB[4]) * t0) * conj(y0[108]) + f[6, 4] * a[i] * exp(1im * (delta[i, 6] + ZB[4]) * t0) * conj(y0[112]) + f[8, 4] * c[i] * exp(1im * (delta[i, 8] + ZB[4]) * t0) * conj(y0[120]) + f[9, 4] * b[i] * exp(1im * (delta[i, 9] + ZB[4]) * t0) * conj(y0[124]) + f[10, 4] * a[i] * exp(1im * (delta[i, 10] + ZB[4]) * t0) * conj(y0[128]) +
conj(f[2, 4] * a[i]) * exp(-1im * (delta[i, 2] + ZB[4]) * t0) * y0[96] + conj(f[3, 4] * b[i]) * exp(-1im * (delta[i, 3] + ZB[4]) * t0) * y0[100] + conj(f[4, 4] * a[i]) * exp(-1im * (delta[i, 4] + ZB[4]) * t0) * y0[104] + conj(f[5, 4] * b[i]) * exp(-1im * (delta[i, 5] + ZB[4]) * t0) * y0[108] + conj(f[6, 4] * a[i]) * exp(-1im * (delta[i, 6] + ZB[4]) * t0) * y0[112] + conj(f[8, 4] * c[i]) * exp(-1im * (delta[i, 8] + ZB[4]) * t0) * y0[120] + conj(f[9, 4] * b[i]) * exp(-1im * (delta[i, 9] + ZB[4]) * t0) * y0[124] + conj(f[10, 4] * a[i]) * exp(-1im * (delta[i, 10] + ZB[4]) * t0) * y0[128])
end
return term
end
a = rand(5)
b = rand(5)
c = rand(5)
s = rand(5)
f = rand(12, 4)
delta = rand(5, 12)
ZB = rand(4)
y0 = rand(136)
t0 = 0.1
@time rel(a, b, c, f, delta, ZB, s, t0, y0)
I also find something interesting, when I only use the first 3 line of term, it only cause 1 allocations, but if I consider the 4th line, it suddenly cause hundreads of allocations. Since in my real program, this sub-function is put into a for loop, that means it will cause a lot of allocations which decided by the total number of for loop~