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

Reply via email to