-
Couldn't load subscription status.
- Fork 1.3k
CSHARP-5554: Improved ObjectId parsing and ToString() performance #257
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Conversation
|
Please ignore the previous comments/closure, was meant for a different PR. |
| { | ||
| return false; | ||
| } | ||
| return obj is ObjectId && Equals((ObjectId)obj); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
| return obj is ObjectId && Equals((ObjectId)obj); | |
| return obj is ObjectId objId && Equals(objId); |
| public override string ToString() | ||
| { | ||
| return BsonUtils.ToHexString(ToByteArray()); | ||
| var buffer = new char[24]; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
| var buffer = new char[24]; | |
| public override string ToString() | |
| { | |
| Span<char> buffer = stackalloc char[24]; | |
| int a = _a; | |
| int b = _b; | |
| int c = _c; | |
| for (int i = 7; i >= 0; i--) | |
| { | |
| var r = (a & 0x0F); | |
| buffer[i] = (char)(r < 10 ? (r + '0') : (r - 10 + 'a')); | |
| a >>= 4; | |
| r = (b & 0x0F); | |
| buffer[i + 8] = (char)(r < 10 ? (r + '0') : (r - 10 + 'a')); | |
| b >>= 4; | |
| r = (c & 0x0F); | |
| buffer[i + 16] = (char)(r < 10 ? (r + '0') : (r - 10 + 'a')); | |
| c >>= 4; | |
| } | |
| return new string(buffer); | |
| } | |
While writing an
ObjectId-like class for another project (where I needed a time-based identifier, but didn't want to bring dependency on a wholeMongoDB.Bsonpackage just forObjectId), I was curious about performance of my implementation compared to the reference one.My test was like serializing a million of identifiers (as strings), and then parsing them back. Here are my results:
ObjectId.ToString()ObjectId.Parse()So this probably looks like a valid reason to make a pull request and improve things a little :)
I'm not sure if it affects other cases where
ObjectIdis serialized, like performance of database responses' deserialization. But shouldn't hurt at least.