Skip to content

Conversation

@bitfaster
Copy link
Owner

@bitfaster bitfaster commented Nov 10, 2021

Modify HitCounter to expose OnItemRemoved() and plumb into an event on ConcurrentLru/ConcurrentTLru. Event fires with a reason (either removed or evicted) whenever an item is removed. Event is invoked before value is disposed (if it is IDisposable).

Enables this code to be written:

var lruEvents = new ConcurrentLru<int, int>(1, 6, EqualityComparer<int>.Default);
List<ItemRemovedEventArgs<int, int>> removedItemList = new();

lruEvents.ItemRemoved += (source, eventArgs) => removedItemList.Add(eventArgs);
lruEvents.GetOrAdd(1, k => k);
lruEventsTryRemove(1);
// event will fire!

LRU.GetOrAdd method total bytes of assembly code:

Fast (event omitted) 280 bytes
Event not registered: 306 bytes
Event registered: 306 bytes

Compared to main, GetOrAdd is increased from 302 to 306 bytes:

image

LRU.Move method total bytes of assembly code:

Fast (event omitted) 441 bytes
Event not registered: 508 bytes
Event registered: 508 bytes

image

Making the event have an empty body to avoid the null check (which is only possible in .NET 6 because it requires a struct field initializer), makes the code 503 bytes but then the event arg is always allocated even if there is no subscribed listener.

@bitfaster bitfaster linked an issue Nov 10, 2021 that may be closed by this pull request
@bitfaster bitfaster changed the title Add event when item is expired Add event when item is evicted Nov 10, 2021
@bitfaster bitfaster marked this pull request as ready for review November 14, 2021 22:37
@bitfaster bitfaster merged commit bb4ff3c into main Nov 14, 2021
@bitfaster bitfaster deleted the users/alexpeck/removedevent branch November 14, 2021 23:33
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Feature] Add event for when an item is expired.

2 participants