Remute icon indicating copy to clipboard operation
Remute copied to clipboard

Possible optimisation for chain of mutations?

Open SuddenGunter opened this issue 6 years ago • 10 comments

If we need to apply several mutations one by one to an entity and we don't need any intermediate results, it would be good if we can achieve it by creating only 1 new instance of entity: Now:

            var tempDevice = _remute.With(deviceRecord, x => x.EndpointArn, endpointArn);
            var updatedDevice = _remute.With(tempDevice, x => x.DeviceName, deviceName);

Want to:

            var updatedDevice = _remute.With(deviceRecord, x => x.EndpointArn,   endpointArn)   
                                    .With(x => x.DeviceName, deviceName);

SuddenGunter avatar Sep 17 '18 08:09 SuddenGunter

@SuddenGunter thanks for posting this. It's implemented as an extension method in 1.0.5. You can do something like this

using Remutable.Extensions;
...

var employee = new Employee(Guid.NewGuid(), "Joe", "Doe");

var actual = employee
    .Remute(x => x.FirstName, "Foo")
    .Remute(x => x.LastName, "Bar");

Assert.AreEqual("Foo", actual.FirstName);
Assert.AreEqual("Bar", actual.LastName);

ababik avatar Sep 18 '18 06:09 ababik

@ababik, thank you!

var actual = employee
    .Remute(x => x.FirstName, "Foo")
    .Remute(x => x.LastName, "Bar");

after calling this - how many employee were actually allocated in memory? 2 (employee and actual) or 3 (+intermediate Remute call)?

SuddenGunter avatar Sep 18 '18 07:09 SuddenGunter

@SuddenGunter
3 (+intermediate Remute call) Extension method is just sugar syntax. Take a look at https://github.com/ababik/Remute/blob/master/Remute/Extensions/ExtensionMethods.cs for details.

ababik avatar Sep 18 '18 07:09 ababik

But is there some possible "magic" that we can use to make it 2? :) even if we do .with().with().with() etc

SuddenGunter avatar Sep 19 '18 08:09 SuddenGunter

It's doable. Can you explain me your use-case a little? Are your instances local variables? Do you modify them in a loop? Do you use Mono? I don't experience any memory issues in my use-cases. Garbage collector does its job well.

ababik avatar Sep 19 '18 16:09 ababik

Just local variables, small services on .Net Core in docker. It would be ok?

SuddenGunter avatar Sep 20 '18 06:09 SuddenGunter

Absolutely.

ababik avatar Sep 20 '18 06:09 ababik

Hi @ababik , Any news on @SuddenGunter suggestions? Even though garbage collector does its job well, it could be beneficial not to create a whole bunch of intermediate objects in high-data-volume scenarios. I think Immutable.Net has this notion of builders to address this exact issue, though their code is much more cumbersome to use in other scenarios than yours.

mmalek06 avatar Jun 16 '20 18:06 mmalek06

@mmalek06 Thanks for the inquiry. This feature is number one in the list. Hope to get it available asap.

ababik avatar Jun 16 '20 18:06 ababik

Just for the context: there is a bit of complexity for this feature because remute supports nested "mutations". E.g instance.Remute(x => x.Prop1.Prop2.Prop3, value)

ababik avatar Jun 17 '20 02:06 ababik