.net - Extend C# Dictionary for Atomic AddOrUpdate -


previously asked question on atomic addorupdate on c# dictionary. answer got extend c# dictionary implementation, found quite rational.

i extended dictionary implementation suggested, however, performance surprisingly bad!! tried minimize tweaks on c# implementation trace cause. minimum reach was: created addorupdate function, has similar signature add except returns bool if dictionary contained key , it's value updated given value, or false if otherwise. on source code made following changes:

public bool addorupdate(tkey key, tvalue value) {     return insert(key, value); } 

and

private bool insert(tkey key, tvalue value) {     if (buckets == null) initialize(0);     int hashcode = comparer.gethashcode(key) & 0x7fffffff;     int targetbucket = hashcode % buckets.length;      (int = buckets[targetbucket]; >= 0; = entries[i].next)     {         if (entries[i].hashcode == hashcode && comparer.equals(entries[i].key, key))         {             entries[i].value = value;             version++;             return true; // on original code, returns void         }     }     int index;     if (freecount > 0)     {         index = freelist;         freelist = entries[index].next;         freecount--;     }     else {         if (count == entries.length)         {             resize();             targetbucket = hashcode % buckets.length;         }         index = count;         count++;     }      entries[index].hashcode = hashcode;     entries[index].next = buckets[targetbucket];     entries[index].key = key;     entries[index].value = value;     buckets[targetbucket] = index;     version++;     return false; // on original code, not return } 

i profiled cpu performance on code, here few snapshots (note: lambdas dictionary of modified type):

this code's cpu profile:

and dictionary code: dictionary code

comparison: code without atomic addorupdate taking 2min, not finish! while occupies more 10gb of ram , takes ever!!

am missing point ?

i guess has you've removed setting of iequalitycomparer.

but instead of adapting insert method i'd suggest call original insert add flag set false addorupdate method. because insert behaves add or update method would.


Comments

Popular posts from this blog

SVG stroke-linecap doesn't work for circles in Firefox? -

routes - Laravel 4 Wildcard Routing to Different Controllers -

cross browser - XSLT namespace-alias Not Working in Firefox or Chrome -