As long as both branches provide the same types for these variables, this
shouldn't be a problem:

julia> function foo(b::Bool)
           if b
               x = 1
           else
               x = 2
           end
           return x
       end
foo (generic function with 1 method)

julia> @code_typed foo(true)
1-element Array{Any,1}:
 :($(Expr(:lambda, Any[:b],
Any[Any[:x],Any[Any[:b,Bool,0],Any[:x,Int64,2]],Any[]], :(begin  # none,
line 2:
        unless b::Bool goto 0 # line 3:
        x = 1
        goto 1
        0:  # line 5:
        x = 2
        1:  # line 7:
        return x::Int64
    end::Int64))))


I'd be happy to dig into this code a little deeper, given a syntactically
complete version.

On Wed, Dec 24, 2014 at 1:11 PM, Gunnar Farnebäck <[email protected]>
wrote:

> Most likely your performance is destroyed by the conditional definition of
> the Ti, c1, ... coefficients. It's a rather unfortunate limitation of the
> type inference, causing all those variables to be handled as Any, and
> everything that depends on them as well, i.e. more or less everything in
> your function. This always leads to terrible performance, especially for
> loops. Try to initialize those coefficients to something of the appropriate
> type at the top of the function and see what happens. E.g. Ti = zeros(0)
> and so on should be fine.
>
> Disclaimer, I didn't test your code. The above is only based on my own
> experience of similar constructions. All the relevant information about
> inferred types is given by code_typed, but it's not the most
> beginner-friendly tool.
>
> Den onsdagen den 24:e december 2014 kl. 17:47:41 UTC+1 skrev
> [email protected]:
>
>> Hi All,
>>
>> I have just started coding a few functions in JULIA with the hope I can
>> gain some speed compared with my existing R code.
>>
>> However the code I have is running 5 times slower than my R code, so I am
>> guessing I have written this very poorly!!
>>
>> The function takes arguments which are arrays, and carries out a simple
>> calculation. In R my code is vectorised nicely. I have written this JULIA
>> code using a loop as I believe this is where JULIA excels??
>>
>> So please can anybody give me some ideas on how to achieve maximum warp
>> speed with JULIA. I am also interested in how to make the loop parallel for
>> more speed. Thank you in advance.
>>
>> If I cannot convince myself of the speed gains with a simple function
>> like this I may just keep life simple and stay with R!!
>>
>> Currently on my machine the below in JULIA takes 31.5secs and my R code
>> takes about 6secs.
>>
>> Here are my arguments and function code. Thanks for all your help in
>> advance.
>>
>>
>> T = 0
>> Mw = ones(100000000)*7
>> Rjb = 100
>> Eps = 0
>> Magdep = 1
>>
>>
>>
>>
>>
>> function RFrb( T, Mw, Rjb, Eps, Magdep)
>>
>> if Magdep == 0
>>
>> #Table 5 Coefficients (Magnitude Independant, Stress Parameter Model)
>> Ti = [0, 0.03, 0.04, 0.05, 0.06, 0.08, 0.1, 0.12, 0.16, 0.2, 0.25, 0.31, 
>> 0.4, 0.5, 0.63, 0.79, 1, 1.25, 1.59, 2, 2.5, 3.13, 4, 5]
>> c1 = [-0.0135, 0.8282, 0.4622, 0.2734,  0.0488, -0.2112, -0.5363, -0.9086, 
>> -1.3733, -1.918, -2.5107, -3.1571, -3.8516, -4.5556, -5.2405, -5.8909, 
>> -6.4633, -6.925, -7.296, -7.5053, -7.5569, -7.451, -7.1688, -6.8063]
>> c2 = [0.6889, 0.5976, 0.6273, 0.6531, 0.6945, 0.7517, 0.8319, 0.93, 1.0572, 
>> 1.2094, 1.3755, 1.5549, 1.7429, 1.9258, 2.0926, 2.2357, 2.3419, 2.4037, 
>> 2.4189, 2.3805, 2.2933, 2.1598, 1.9738, 1.7848]
>> c3 = [-0.0488, -0.0418, -0.0391, -0.0397, -0.042, -0.046, -0.0521, -0.0597, 
>> -0.0698, -0.0819, -0.0949, -0.1087, -0.1228, -0.136, -0.1471, -0.1557, 
>> -0.1605, -0.1612, -0.1573, -0.1492, -0.1376, -0.1228, -0.1048, -0.0879]
>> c4 = [-1.8987, -2.1321, -1.7242, -1.5932, -1.4913, -1.4151, -1.3558, -1.309, 
>> -1.2677, -1.2315, -1.1992, -1.1677, -1.1354, -1.1015, -1.0659, -1.0279, 
>> -0.9895, -0.9545, -0.9247, -0.9128, -0.9285, -0.9872, -1.1274, -1.3324]
>> c5 = [0.2151, 0.2159, 0.1644, 0.1501, 0.1405, 0.134, 0.1296, 0.1264, 0.1237, 
>> 0.1213, 0.1189, 0.116, 0.1126, 0.1084, 0.1035, 0.0981, 0.0925, 0.0879, 
>> 0.0848, 0.0855, 0.0915, 0.105, 0.1325, 0.1691]
>> c6 = [-1.9063, -2.053, -1.6849, -1.5698, -1.4807, -1.413, -1.3579, -1.312, 
>> -1.2684, -1.227, -1.1881, -1.1494, -1.1099, -1.0708, -1.0328, -0.9969, 
>> -0.9665, -0.9462, -0.9421, -0.9658, -1.0264, -1.1349, -1.3132, -1.5158]
>> c7 = [0.174, 0.1676, 0.127, 0.1161, 0.1084, 0.1027, 0.0985, 0.0948, 0.091, 
>> 0.0872, 0.0833, 0.0791, 0.0746, 0.07, 0.0655, 0.0612, 0.0577, 0.0558, 
>> 0.0567, 0.0619, 0.0729, 0.0914, 0.1207, 0.1533]
>> c8 = [-2.0131, -1.5148, -1.4513, -1.535, -1.6563, -1.7821, -1.8953, -1.9863, 
>> -2.0621, -2.1196, -2.1598, -2.1879, -2.2064, -2.2171, -2.222, -2.2229, 
>> -2.2211, -2.2178, -2.2137, -2.211, -2.2108, -2.2141, -2.2224, -2.2374]
>> c9 = [0.0887, 0.1163, 0.091, 0.0766, 0.0657, 0.0582, 0.052, 0.0475, 0.0434, 
>> 0.0396, 0.0361, 0.0328, 0.0294, 0.0261, 0.0229, 0.0197, 0.0167, 0.0139, 
>> 0.0111, 0.0086, 0.0067, 0.006, 0.0079, 0.0142]
>> c10 = [-0.002747, -0.004463, -0.004355, -0.003939, -0.003449, -0.002987, 
>> -0.002569, -0.002234, -0.001944, -0.001708, -0.001522, -0.001369, -0.00124, 
>> -0.001129, -0.001033, -0.000945, -0.000863, -0.000785, -0.000701, -0.000618, 
>> -0.000535, -0.000458, -0.000397, -0.000387]
>> c11 = [1.5473,  1.1096, 1.1344, 1.1493, 1.2154, 1.2858, 1.3574, 1.426,  
>> 1.4925, 1.5582, 1.6049, 1.6232, 1.632,  1.6109, 1.5735, 1.5262, 1.4809, 
>> 1.471,  1.5183, 1.6365, 1.8421, 2.1028, 2.4336, 2.6686]
>> sigT = [0.436,  0.449,  0.445,  0.442,  0.438,  0.433,  0.428,  0.422,  
>> 0.416,  0.409,  0.402,  0.395,  0.387,  0.378,  0.369,  0.36, 0.35, 0.341,  
>> 0.331,  0.323,  0.315,  0.308,  0.299,  0.291]
>> sigB = [0.409,  0.417,  0.417,  0.416,  0.414,  0.41,   0.405,  0.399,  
>> 0.392,  0.384,  0.376,  0.366,  0.356,  0.345,  0.333,  0.32,   0.307,  
>> 0.294,  0.28,   0.267,  0.254,  0.242,  0.227,  0.214]
>> sigW = [0.153,  0.167,  0.155,  0.149,  0.143,  0.14,   0.138,  0.138,  
>> 0.139,  0.141,  0.144,  0.148,  0.152,  0.156,  0.16,   0.164,  0.168,  
>> 0.172,  0.177,  0.181,  0.186,  0.19,   0.195,  0.198]
>>
>> else
>>
>> #Table 6 Coefficients (Magnitude Dependant, Stress Parameter Model)
>> Ti = [0, 0.03, 0.04, 0.05, 0.06, 0.08, 0.1, 0.12, 0.16, 0.2, 0.25, 0.31, 
>> 0.4, 0.5, 0.63, 0.79, 1, 1.25, 1.59, 2, 2.5, 3.13, 4, 5]
>> c1 = [-2.6934, -1.9654, -2.3216, -2.4879, -2.6647, -2.8579, -3.092, -3.3595, 
>> -3.6974, -4.1004,  -4.5462, -5.0372, -5.565, -6.0933, -6.5914, -7.0402, 
>> -7.4028, -7.6577, -7.8128, -7.8368, -7.7341, -7.4991, -7.1376, -6.7757]
>> c2 = [1.7682, 1.7265, 1.7592, 1.7771, 1.8009, 1.8325, 1.8771, 1.9336, 
>> 2.0096, 2.1032, 2.2068, 2.318, 2.4307, 2.5325, 2.6123, 2.6616, 2.6715, 
>> 2.6402, 2.5609, 2.444, 2.2967, 2.1232, 1.9232, 1.7502]
>> c3 = [-0.1366, -0.1346, -0.1328, -0.1328, -0.1336, -0.1353, -0.1381, 
>> -0.1419, -0.1472, -0.1537, -0.1607, -0.1679, -0.1745, -0.1795, -0.182, 
>> -0.1813, -0.1767, -0.1686, -0.1559, -0.1409, -0.1244, -0.1072, -0.0893, 
>> -0.0753]
>> c4 = [-1.8544, -2.1011, -1.7198, -1.591, -1.4916, -1.4169, -1.3587, -1.3133, 
>> -1.2717, -1.2341, -1.1985, -1.1625, -1.1242, -1.0837, -1.0432, -1.0023, 
>> -0.9634, -0.9299, -0.9021, -0.8896, -0.9012, -0.9638, -1.1238, -1.3603]
>> c5 = [0.2123, 0.2101, 0.1635, 0.1502, 0.1409, 0.1349, 0.1312, 0.1289, 
>> 0.1262, 0.1234, 0.1198, 0.1155, 0.1104, 0.1043, 0.0985, 0.0927, 0.0877, 
>> 0.0842, 0.0829, 0.0857, 0.0975, 0.1202, 0.1549, 0.196]
>> c6 = [-1.8467, -2.0063, -1.6582, -1.5447, -1.4576, -1.3909, -1.3363, 
>> -1.2908, -1.2472, -1.2055, -1.1658, -1.1258, -1.0847, -1.0436, -1.0044, 
>> -0.9683, -0.9394, -0.9226, -0.9242, -0.9546, -1.027, -1.1604, -1.3647, 
>> -1.5804]
>> c7 = [0.159, 0.1555, 0.1192, 0.1087, 0.1013, 0.0959, 0.0919, 0.0884, 0.0847, 
>> 0.0809, 0.077, 0.0728, 0.0682, 0.0635, 0.0591, 0.0552, 0.0526, 0.0519, 
>> 0.0544, 0.0613, 0.0747, 0.0965, 0.1284, 0.1613]
>> c8 = [-1.8809, -1.3684, -1.3348, -1.4304, -1.5603, -1.6918, -1.8091, 
>> -1.9038, -1.9844, -2.0474, -2.0935, -2.1276, -2.1519, -2.168, -2.1775, 
>> -2.182, -2.1827, -2.1811, -2.1782, -2.1751, -2.1717, -2.1763, -2.1901, 
>> -2.207]
>> c9 = [0.0681, 0.0946, 0.073, 0.0599, 0.0494, 0.0423, 0.0363, 0.0322, 0.0286, 
>> 0.0254, 0.0227, 0.0201, 0.0176, 0.0152, 0.0129, 0.0109, 0.0092, 0.0079, 
>> 0.0069, 0.0064, 0.0066, 0.0077, 0.0114, 0.0191]
>> c10 = [-0.002888, -0.004626, -0.004488, -0.004056, -0.003549, -0.003077, 
>> -0.002651, -0.002311, -0.002015, -0.001772, -0.001579, -0.001419, -0.001282, 
>> -0.001166, -0.001066, -0.000977, -0.000898, -0.000827, -0.000756, -0.000691, 
>> -0.000634, -0.000571, -0.000515, -0.000518]
>> c11 = [2.1589, 1.3437, 1.3363, 1.3942, 1.4587, 1.5466, 1.6583, 1.7807, 
>> 1.854, 1.9055, 1.9052, 1.8732, 1.8142, 1.7238, 1.6524, 1.59, 1.5549, 1.5712, 
>> 1.6701, 1.9205, 2.6233, 3.5221, 4.0984, 4.3313]
>> sigT = [0.335, 0.348, 0.343, 0.339, 0.335, 0.33, 0.325, 0.32, 0.314, 0.307, 
>> 0.301, 0.294, 0.288, 0.282, 0.276, 0.272, 0.268, 0.265, 0.262, 0.26, 0.258, 
>> 0.256, 0.253, 0.251]
>> sigB = [0.298, 0.304, 0.305, 0.304, 0.302, 0.299, 0.295, 0.289, 0.282, 
>> 0.273, 0.263, 0.253, 0.242, 0.231, 0.22, 0.21, 0.201, 0.193, 0.185, 0.177, 
>> 0.169, 0.161, 0.152, 0.144]
>> sigW = [0.154, 0.169, 0.157, 0.15, 0.144, 0.14, 0.138, 0.137, 0.138, 0.141, 
>> 0.145, 0.15, 0.155, 0.161, 0.167, 0.172, 0.177, 0.181, 0.186, 0.191, 0.195, 
>> 0.199, 0.203, 0.205]
>>
>> end
>>
>> tidLO = find( Ti .<= T )
>> tidHI = find( Ti .>= T )
>> tidLO = tidLO[length(tidLO)]
>> tidHI = tidHI[1]
>>
>> if tidLO == tidHI  # we have a known period
>> tid = tidHI
>>
>> Ti = Ti[tid]
>> c1 = c1[tid]
>> c2 = c2[tid]
>> c3 = c3[tid]
>> c4 = c4[tid]
>> c5 = c5[tid]
>> c6 = c6[tid]
>> c7 = c7[tid]
>> c8 = c8[tid]
>> c9 = c9[tid]
>> c10 = c10[tid]
>> c11 = c11[tid]
>> sigT = sigT[tid]
>> sigB = sigB[tid]
>> sigW = sigW[tid]
>>
>> Sa = zeros(length(Mw))
>>
>> for i = 1:length(Mw)
>>
>> R = sqrt(Rjb^2 + c11^2)
>> r0 = 10
>> r1 = 50
>> r2 = 200
>>
>> if R <= r0
>>     F0 = log10(r0/R)
>> else
>>     F0 = 0
>> end
>>
>> if R <= r1
>>     F1 = log10(R/1.0)
>> else
>>     F1 = log10(r1/1.0)
>> end
>>
>> if R <= r2
>>     F2 = 0
>> else
>>     F2 = log10(R/r2)
>> end
>>
>> return Sa[i] = 10^(c1 + c2*Mw[i] + c3*Mw[i]^2 + (c4+c5*Mw[i])*F0 + 
>> (c6+c7*Mw[i])F1 + (c8+c9*Mw[i])*F2 + c10*R + Eps*sigT) / 981
>>
>> end
>>
>>

Reply via email to