From mtmorgan at fhcrc.org  Thu Jul  2 14:58:28 2009
From: mtmorgan at fhcrc.org (Martin Morgan)
Date: Thu, 02 Jul 2009 05:58:28 -0700
Subject: [Rd] V2.9.0 changes [Sec=Unclassified]
In-Reply-To: <42C7503E0B99F248B06BC65E7D2B4E020122C50FB2FD@EX2K7-CCR.AAD.GOV.AU>
References: <42C7503E0B99F248B06BC65E7D2B4E020122C50FB2FD@EX2K7-CCR.AAD.GOV.AU>
Message-ID: <4A4CAEF4.3070008@fhcrc.org>

Troy Robertson wrote:
> Well...
> 
> My performance problems were in the pass-by-value semantics of R.
> 
> I have just changed my classes to inherit from .environment and then moved data members from S4 slots to the .xData objects as Martin suggested.

Actually, I had hoped the take-home message would be in the final paragraph:

>> Of course I haven't seen your code, but a different interpretation of
>> your performance issues is that, within the rules of S4, you've chosen
>> to implement functionality in an inefficient way. So it might be
>> instructive to step back a bit and try to reformulate your data
>> structures and methods. This is hard to do.

Martin

> That meant I could remove all my returns and assignments on all method calls.
> 
> This has sped execution time for my model up by more than an order of magnitude. Eg one test simulation from 1931 secs down to 175 secs.
> 
> Not bad seeing as though the class structure, functionality and logic has not been touched.
> 
> I really do think S4 could benfit from having its slots stored in environment when the class enherits from .environment.  It would be a lot more sensible if my data members were still declared as S4 slots instead of having to hide them in .xData
> 
> Troy
> 
> 
> Troy Robertson
> Database and Computing Support Provider
> Southern Ocean Ecosystems, ERM/Fish
> Australian Antarctic Division
> Channel Highway, Kingston 7050
> PH: 03 62323571
> Troy.Robertson at aad.gov.au
> 
> 
>> -----Original Message-----
>> From: Martin Morgan [mailto:mtmorgan at fhcrc.org]
>> Sent: Tuesday, 23 June 2009 11:25 PM
>> To: Troy Robertson
>> Cc: 'r-devel at R-project.org'
>> Subject: Re: [Rd] V2.9.0 changes [Sec=Unclassified]
>>
>> Troy Robertson wrote:
>>> Hi all,
>>>
>>>
>>>
>>> Prefix: I am a frustrated Java coder in R.
>> ah good, if you're frustrated with Java you'll find R very different ;)
>>
>>>
>>>
>>> I am coding a medium sized ecosystem modelling program in R.  I have
>> changed to using S4 objects and it has cost me an order of magnitude in
>> execution speed over the functional model.  I cannot afford this penalty
>> and have found that it is the result of all the passing-by-value of
>> objects.
>>>
>>>
>>> I see that you can now safely inherit from environment in V2.9.0.
>>>
>>> That got me all excited that I would now be able to pass objects by
>> reference.
>>>
>>>
>>> But...
>>>
>>> That doesn't seem to be the case.
>>>
>>> It only seem that passing an environment which holds the object allows
>> for pass-by-reference and that passing an object which inherits from
>> environment doesn't.
>>> Why is this the case, either an object inherits the properties of its
>> parent or it doesn't.
>>
>> The object inherits slots from it's parent, and the methods defined on
>> the parent class. Maybe this example helps?
>>
>> setClass("Ticker", contains=".environment")
>>
>> ## initialize essential, so each instance gets its own environment
>> setMethod(initialize, "Ticker",
>>           function(.Object, ..., .xData=new.env(parent=emptyenv()))
>> {
>>     .xData[["count"]] <- 0
>>     callNextMethod(.Object, ..., .xData=.xData)
>> })
>>
>> ## tick: increment (private) counter by n
>> setGeneric("tick", function(reference, n=1L) standardGeneric("tick"),
>>            signature="reference")
>>
>> setMethod(tick, "Ticker", function(reference, n=1L) {
>>     reference[["count"]] <- reference[["count"]] + n
>> })
>>
>> ## tock: report current value of counter
>> setGeneric("tock", function(reference) standardGeneric("tock"))
>>
>> setMethod(tock, "Ticker", function(reference) {
>>     reference[["count"]]
>> })
>>
>> and then
>>
>>> e <- new("Ticker")
>>> tock(e)
>> [1] 0
>>> tick(e); tick(e, 10); tock(e)
>> [1] 11
>>> f <- e
>>> tock(f); tick(e); tock(f)
>> [1] 11
>> [1] 12
>>
>> The data inside .environment could be structured, too, using S4.
>> Probably it would be more appropriate to have the environment as a slot,
>> rather the class that is being extended. And in terms of inherited
>> 'properties', e.g., the "[[" function as defined on environments is
>> available
>>
>>> e[["count"]]
>> Of course I haven't seen your code, but a different interpretation of
>> your performance issues is that, within the rules of S4, you've chosen
>> to implement functionality in an inefficient way. So it might be
>> instructive to step back a bit and try to reformulate your data
>> structures and methods. This is hard to do.
>>
>> Martin
>>
>>> Has anyone else had a play with this?  Or have I got it all wrong.
>>>
>>>
>>>
>>> I tried the below:
>>>
>>> ------------------------------------------------------------------------
>> -----------------
>>> setClass('foo', representation=representation(stuff='list',
>> bar='numeric'),
>>>                      prototype=list(stuff=list(), bar=0),
>>>
>>>                      contains='.environment')
>>>
>>>
>>>
>>> setGeneric('doit', function(.Object, newfoo='environment')
>> standardGeneric('doit'))
>>>
>>>
>>> setMethod('doit', 'foo', function(.Object, newfoo){newfoo at bar <- 10})
>>>
>>>
>>>
>>> z <- new('foo')
>>>
>>>
>>>
>>> z at stuff$x <- new('foo')
>>>
>>>
>>>
>>> doit(z,z at stuff$x)
>>>
>>>
>>>
>>> z at stuff$x at bar
>>>
>>>
>>>
>>> [1] 0
>>>
>>> ------------------------------------------------------------------------
>> ------------------
>>>
>>>
>>> Can anyone help with a better way of doing this.
>>>
>>> I'm trying to avoid all the indirection of packing and unpacking
>> environments for passing.
>>>
>>>
>>>
>>>
>>> Thanks heaps
>>>
>>>
>>>
>>> Troy
>>>
>>>
>>>
>>>
>>>
>>> Troy Robertson
>>>
>>> Database and Computing Support Provider
>>>
>>> Southern Ocean Ecosystems, ERM/Fish
>>>
>>> Australian Antarctic Division
>>>
>>> Channel Highway, Kingston 7050
>>>
>>> PH: 03 62323571
>>>
>>> Troy.Robertson at aad.gov.au
>>>
>>>
>>>
>>>
>>>
>> __________________________________________________________________________
>> _
>>>     Australian Antarctic Division - Commonwealth of Australia
>>> IMPORTANT: This transmission is intended for the addressee only. If you
>> are not the
>>> intended recipient, you are notified that use or dissemination of this
>> communication is
>>> strictly prohibited by Commonwealth law. If you have received this
>> transmission in error,
>>> please notify the sender immediately by e-mail or by telephoning +61 3
>> 6232 3209 and
>>> DELETE the message.
>>>         Visit our web site at http://www.antarctica.gov.au/
>>>
>> __________________________________________________________________________
>> _
>>>       [[alternative HTML version deleted]]
>>>
>>> ______________________________________________
>>> R-devel at r-project.org mailing list
>>> https://stat.ethz.ch/mailman/listinfo/r-devel
> 
> ___________________________________________________________________________
> 
>     Australian Antarctic Division - Commonwealth of Australia
> IMPORTANT: This transmission is intended for the addressee only. If you are not the
> intended recipient, you are notified that use or dissemination of this communication is
> strictly prohibited by Commonwealth law. If you have received this transmission in error,
> please notify the sender immediately by e-mail or by telephoning +61 3 6232 3209 and
> DELETE the message.
>         Visit our web site at http://www.antarctica.gov.au/
> ___________________________________________________________________________



[Rd] V2.9.0 changes [Sec=Unclassified]
Martin Morgan