No, there hasn't been any change on this. It's unclear if anything from the Rust model can actually be leveraged in a dynamic language.
> On May 9, 2015, at 3:46 PM, Michael Louwrens <michael.w.louwr...@outlook.com> > wrote: > > Have you had any further thought on this? It seems like it could be quite > useful for the cases where one intentionally disables the GC for performance > reasons - though you guys are incredibly busy! I also read about having the > compiler automatically insert frees where it can in Julia and was wondering > if that fits at all into this? > >> On Tuesday, 16 December 2014 23:24:08 UTC+2, Stefan Karpinski wrote: >> I would love to figure out a way to bring the kind of automatic resource and >> memory release that Rust has to Julia, but the cost is some fairly finicky >> static compiler analysis that is ok for Rust's target demographic but fairly >> clearly unacceptable for Julia general audience. What we'd need is a more >> dynamic version of something like that. One idea I've had is to indicate >> ownership and enforce it at run-time rather than compile time – and >> eliminate run-time checks when we can prove that they aren't needed. This >> could look something like having "owned references" to values versus >> "borrowed references" and check that the object still exists if the borrowed >> reference is used and raise an error if it doesn't. When an owned reference >> to the thing goes out of scope, immediately finalize it. I'm not sure how to >> indicate this, but it would be great to be able to write: >> >> function foo(...) >> fh = open(file) >> # do stuff with fh >> end # <= fh is automatically before the function returns >> # it's a runtime error to access the fh object after this >> >> Similarly, you could have something like this: >> >> function bar(...) >> a = @local Array(Int,10) >> # do stuff with a >> end # <= a is automatically freed before the function returns >> # it's a runtime error to access the a object after this >> >> Given these semantics, it would be relatively easy to alloca the actual >> memory of the array, and only heap allocate the object itself, which could >> then reference the stack allocated memory. This is tough to implement, >> especially efficiently, but I have a bit of a suspicion that in Julia >> mutable objects – and this only makes sense for mutable objects that are >> inherently associated with a particular place in memory – are rarely >> performance critical in Julia. >> >> >>> On Mon, Dec 15, 2014 at 11:15 PM, John Myles White <johnmyl...@gmail.com> >>> wrote: >>> This is taking the thread off-topic, but conceptually such things are >>> possible. But Rust has a very different set of semantics for memory >>> ownership than Julia has and is doing a lot more analysis at compile-time >>> than Julia is doing. So Julia would need to change a lot to be more like >>> Rust. I've come to really adore Rust, so I'd like to see us borrow some >>> ideas, but my personal sense is that Julia and Rust simply serve different >>> niches and shouldn't really move towards one another too much lest each >>> language wind up forsaking what makes it useful. >>> >>> -- John >>> >>> >>>> On Dec 15, 2014, at 8:43 PM, Eric Forgy <eric....@gmail.com> wrote: >>>> >>>> Hi, >>>> >>>> I'm new to Julia and mentioned it to a friend who is more into systems >>>> than mathematical models and he mentioned his current "crush" is Rust, >>>> which is also built on LVVM. I may have totally missed the point, but IF I >>>> understand, Rust does away with garbage collection by "borrow blocking" at >>>> compile time. The question popped into my head whether we could turn off >>>> GC in Julia and check for problems at compile time. A google later, >>>> brought me to this thread. Is that a totally misguided idea? >>>> >>>> Best regards, >>>> Eric >>>> >>>> PS: You can tell I'm coming in with almost no background knowledge about >>>> compilers (or real languages for that matter), but am having fun learning. >>>> LVVM was developed at my alma mater (PhD in ECE - Computational >>>> Electromagnetics - from UIUC 2002). Go Illini! :) >>>> >>>>> On Friday, February 22, 2013 7:11:32 PM UTC+8, Tim Holy wrote: >>>>> Have you played with SProfile in the Profile package? It's rather good at >>>>> highlighting which lines, in your code and in base/, trigger the gc. Note >>>>> that >>>>> in my experience the gc does not seem to be triggered necessarily on big >>>>> allocations; for example, even allocating an array as >>>>> Array(Int, (3,5)) >>>>> rather than >>>>> Array(Int, 3, 5) >>>>> can trigger the gc (I see lots of gc() calls coming from our Lapack code >>>>> for >>>>> this reason). >>>>> >>>>> Because I don't really know how the gc works, I'm not certain that kind >>>>> of >>>>> thing actually reflects a problem; perhaps it was just going to have to >>>>> call gc >>>>> on the next heap-allocation event, and (3,5) just happened to be the >>>>> lucky >>>>> candidate. But there's an open issue about this: >>>>> https://github.com/JuliaLang/julia/issues/1976 >>>>> >>>>> Docs are here: https://github.com/timholy/Profile.jl >>>>> I think they're slightly out of date, but only in very minor ways. >>>>> >>>>> --Tim >>>>> >>>>> >>>>> >>>>> On Thursday, February 21, 2013 03:17:59 PM nathan hodas wrote: >>>>> > Here's the code that benefits from @nogc: >>>>> > >>>>> > Notice the iteration over a Dict and a Set. iscorrect() checks a field >>>>> > of >>>>> > the Attempt type. I can tell by running this particular that the >>>>> > garbage >>>>> > collection is running during the for loop. >>>>> > function meantime(userdata::Dict{Int,Set{Attempt}}) >>>>> > usertimes = Dict{Int,Float64}() >>>>> > sizehint(usertimes,length(userdata)) >>>>> > for (uid,attempts) in collect(userdata) >>>>> > s = 0.0; >>>>> > c = 0.0; >>>>> > ic = 0.0; >>>>> > for a in attempts >>>>> > ic = iscorrect(a) >>>>> > s += (a.tend - a.tstart)*ic; >>>>> > c += ic; >>>>> > end >>>>> > usertimes[uid] = s/c; >>>>> > end >>>>> > usertimes >>>>> > end >>>>> > >>>>> > This code has no benefit from @nogc, regardless of the kernel function >>>>> > k1: >>>>> > >>>>> > function dostuff(input1,input2) >>>>> > output = similar(input1) >>>>> > len = length(input1) >>>>> > for i = 1:len >>>>> > x = input1[i] >>>>> > for j = 1:len >>>>> > y = input2[j] >>>>> > output[i] += k1(x,y) >>>>> > end >>>>> > end >>>>> > output >>>>> > end >>>>> > >>>>> > On Thursday, February 21, 2013 10:37:09 AM UTC-8, Stefan Karpinski >>>>> > wrote: >>>>> > > Can you post some example code? Are you just iterating the Dict >>>>> > > object >>>>> > > with a for loop? >>>>> > > >>>>> > > >>>>> > > On Thu, Feb 21, 2013 at 1:35 PM, Stefan Karpinski >>>>> > > <ste...@karpinski.org<javascript:>> >>>>> > > > wrote: >>>>> > >> That's good information to have. I'll look into it. >>>>> > >> >>>>> > >> >>>>> > >> On Thu, Feb 21, 2013 at 1:13 PM, nathan hodas >>>>> > >> <nho...@gmail.com<javascript:>>> >>>>> > >> > wrote: >>>>> > >>> It's true that @nogc is not a panacea. For my particular function, >>>>> > >>> it >>>>> > >>> produces a robust 20x speed up, even after subsequent collection. >>>>> > >>> For >>>>> > >>> other seemingly similar functions, it has no effect at all. I don't >>>>> > >>> use >>>>> > >>> any >>>>> > >>> temporary arrays *that I'm aware of*, but it seems the iterators of >>>>> > >>> a >>>>> > >>> Dict >>>>> > >>> are doing something in the background. >>>>> > >>> >>>>> > >>> On Wednesday, February 20, 2013 3:44:24 PM UTC-8, Tim Holy wrote: >>>>> > >>>> The other thing you should check is whether you're allocating more >>>>> > >>>> than >>>>> > >>>> you >>>>> > >>>> need to. I find that I can often reuse bits of memory, and that >>>>> > >>>> can >>>>> > >>>> dramatically decrease the need for gc. In the long run that may >>>>> > >>>> help >>>>> > >>>> you a >>>>> > >>>> _lot_ more than temporarily disabling gc, because at some point >>>>> > >>>> you'll >>>>> > >>>> need to >>>>> > >>>> turn it on again. >>>>> > >>>> >>>>> > >>>> There are examples of this kind of thing scattered all over the >>>>> > >>>> Julia >>>>> > >>>> code >>>>> > >>>> tree. Just because it was rather easy for me to find :-), here's >>>>> > >>>> the >>>>> > >>>> patch I >>>>> > >>>> pushed to Zip in iterator.jl today: >>>>> > >>>> https://github.com/JuliaLang/**julia/commit/** >>>>> > >>>> 89ece095e8ea1fa166074306927c6c**c5f90060f7<https://github.com/JuliaLang >>>>> > >>>> >>>>> > >>>> /julia/commit/89ece095e8ea1fa166074306927c6cc5f90060f7> It got rid >>>>> > >>>> of >>>>> > >>>> two array allocations per iteration, by reusing one array and >>>>> > >>>> pre-allocating "scratch space" inside the type for the other. >>>>> > >>>> >>>>> > >>>> You can also reuse bits of memory by writing functions with a >>>>> > >>>> syntax >>>>> > >>>> like >>>>> > >>>> >>>>> > >>>> this: >>>>> > >>>> function myfunc(out::Array, arg1, arg2) >>>>> > >>>> >>>>> > >>>> where out is pre-allocated storage for the output. This helps if >>>>> > >>>> you'll >>>>> > >>>> be >>>>> > >>>> calling the same function many times and always need an array of >>>>> > >>>> the >>>>> > >>>> same type >>>>> > >>>> and dimensions. Our matrix multiplication routines can be used in >>>>> > >>>> this >>>>> > >>>> way. >>>>> > >>>> >>>>> > >>>> --Tim >>