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