Ohhh! That’s the problem! Thanks you so much for your help! Yijing
> On Dec 1, 2014, at 9:16 PM, John Myles White <[email protected]> wrote: > > I would urge you to reconsider the usage of cell arrays. When you index into > a cell array, you're telling the compiler that it cannot safely make any > assumptions about what's going to come out of the array, which may cause the > compiler to box values that could otherwise be unboxed. Assuming that such > unnecessary boxing occurs, it could potentially cause superfluous memory > allocation. > > -- John > > On Dec 1, 2014, at 7:08 PM, WuYijing <[email protected] > <mailto:[email protected]>> wrote: > >> Hi John, >> >> Actually I want to put 0-1000 into a n by n matrix, and I want each entry to >> be a array containing some of these numbers from 1 to 1000. Given an pair >> (i,j), I want to get an array B[i,j], so I think cell is a better way to do >> it than putting arrays in arrays (like [[],[],…]). >> >> And I want to use B[2,3][i] to calculate something, and it seems better if I >> use the second method(creating a list T rather than use x), when i bigger >> than 512, in first method, both 2 steps requires allocations, but in the >> second one, the second @time doesn’t require allocation. >> >> @time x=B[2,3][i] >> @time y=x^2+2*x+sqrt(x) >> println(x) >> >> >> @time T[i]=B[2,3][i] >> @time y=T[i]^2+2*T[i]+sqrt(T[i]) >> println(T[i]) >> >> This problem really frustrated me, and I really appreciate your advice. The >> code is for your convenience: >> function test() >> >> B=fill!(cell(5,5),Int64[]) >> >> for i=1:513 >> >> push!(B[2,3],i) >> >> end >> >> T=zeros(Int64,513) >> >> y=0.0 >> >> for i=1:513 >> >> @time T[i]=B[2,3][i] >> >> @time y=T[i]^2+2*T[i]+sqrt(T[i]) >> >> println(T[i]) >> >> end >> >> for i=1:513 >> >> @time x=B[2,3][i] >> >> @time y=x^2+2*x+sqrt(x) >> >> println(x) >> >> end >> >> >> >> end >> >> >> Yijing >> >> >>> On Dec 1, 2014, at 8:49 PM, John Myles White <[email protected] >>> <mailto:[email protected]>> wrote: >>> >>> Hi Yijing, >>> >>> Thanks for the update. I'm a little confused by somethings happening in >>> your code. >>> >>> (1) Do you really need to use cell(5, 5)? In general, you'll want to use >>> more tightly typed arrays. >>> >>> (2) Do you really want to fill the B array with many copies of the exact >>> same pointer? This seems improbable. Did you perhaps want to create a new >>> Int64[] array for every element of B? >>> >>> -- John >>> >>> On Dec 1, 2014, at 6:45 PM, Yijing Wu <[email protected] >>> <mailto:[email protected]>> wrote: >>> >>>> Sorry it seems that I simplified my problem too much in the previous code. >>>> Actually I am running something similar to the following, and I run it as >>>> a function and it starts to have allocation since i=512. I am really >>>> unsure if it's my coding problem(so it can be improved to 0 bytes) or it >>>> is natural in the system that allocations appear. Thank you so much! >>>> >>>> function test() >>>> B=fill!(cell(5,5),Int64[]) >>>> >>>> for i=1:513 >>>> push!(B[2,3],i) >>>> end >>>> >>>> T=zeros(Int64,513) >>>> >>>> for i=1:513 >>>> @time T[i]=B[2,3][i] >>>> println(T[i]) >>>> end >>>> end >>>> >>>> >>>> 在 2014年12月1日星期一UTC-6下午7时24分31秒,John Myles White写道: >>>> Did you run this inside a function? If not, your results are not going to >>>> be useful indicators of how code will perform inside a function. >>>> >>>> Inside of a function body, I see 0 bytes being allocated. >>>> >>>> -- John >>>> >>>> On Dec 1, 2014, at 4:53 PM, Yijing Wu <[email protected] <javascript:>> >>>> wrote: >>>> >>>>> Hi all, I found a strange problem about a very simple code in julia and >>>>> hopefully I can get some help from you, here is the code: >>>>> >>>>> >>>>> B=[1:1000] >>>>> T=zeros(Int64,1000) >>>>> for i=1:1000 >>>>> @time T[i]=B[i] >>>>> println(T[i]) >>>>> end >>>>> >>>>> And when I run the code, the @time shows that it require 48 bytes >>>>> allocation when i is larger than or equal to 512, and 0 bytes when >>>>> smaller. Is this a problem that can be improved or I have to accept that >>>>> it is designed to take some allocations when larger than 512? >>>>> >>>>> Thanks a lot for your help! >>>>> >>>> >>> >> >
