[#51] Fix performance issue with Object Store - #52
Conversation
When BaseMaxSimultaneous was set to a large number the object-store was spending to much time finding the handle. This was fixed using a dictionary where the keys have the objects full hash.
|
After looking at this in the morning I realized I'm keying with hashcodes which is not guaranteed to be unique. |
|
@AustinSmith13 let me know if you fix the uniqueness problem and I'll review. Thanks for the PR! 👍 |
|
@jacksondunstan After a little bit of research So I don't think its likely to have a hash-code duplicate in the same app-domain but maybe after collection which I don't think is a problem. I did implement a version with hash collision handling but it less nice looking and is probably slower. (but not by much) I am thinking about keeping it the way it is, but microsoft advises against it here https://docs.microsoft.com/en-us/dotnet/api/system.object.gethashcode?view=netframework-4.8 public static int GetHandle(object obj)
{
// Null is always zero
if (object.ReferenceEquals(obj, null))
{
return 0;
}
lock (objects)
{
// Look up the handle in the hash table
uint hash = (uint)obj.GetHashCode();
List<int> handleBucket = null;
if (handleBucketByHash.TryGetValue(hash, out handleBucket))
{
for (int i = 0; i < handleBucket.Count; i++)
{
int handleInBucket = handleBucket[i];
object objectInBucket = objects[handleInBucket];
if (object.ReferenceEquals(objectInBucket, obj))
{
return handleInBucket;
}
}
}
}
// Object not found
return Store(obj);
}I've tried to cause hash collisions by creating and destroying thousands of objects per frame. No collisions. If you are fine with whats there I would like to keep it the way it is without any collision handling for slight performance benefit. |
|
Sorry about constantly changing this I can't help but try to make things perfect. I realize a better way of doing this would be to use a single dictionary |
…objects Dictionary<object, int> will take care of hashing/collisions for us.
|
@jacksondunstan This is ready for review. After looking into how dictionaries work, I realized they already do everything I was previously trying to do. Internally they call GetHashCode and check equality for collisions. |
jacksondunstan
left a comment
There was a problem hiding this comment.
Hey @AustinSmith13, thanks for the continued development on this PR. I just had a few comments and two of them are pretty minor.
When BaseMaxSimultaneous was set to a large number the object-store was
spending to much time finding the handle. This was fixed using a
dictionary where the keys have the objects full hash.