Skip to content

CSHARP-5554: Improved ObjectId parsing and ToString() performance #257

New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

Open
wants to merge 2 commits into
base: main
Choose a base branch
from

Conversation

pieceofsummer
Copy link

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 whole MongoDB.Bson package just for ObjectId), 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()
MongoDB.Bson (v2.3.0) 3475ms 897ms
My (humble) implementation 87ms 81ms

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 ObjectId is serialized, like performance of database responses' deserialization. But shouldn't hurt at least.

@damieng damieng closed this Feb 7, 2024
@damieng damieng reopened this Feb 7, 2024
@damieng damieng requested a review from a team as a code owner February 7, 2024 13:38
@damieng damieng requested review from adelinowona and removed request for a team and adelinowona February 7, 2024 13:38
@damieng
Copy link
Member

damieng commented Feb 7, 2024

Please ignore the previous comments/closure, was meant for a different PR.

{
return false;
}
return obj is ObjectId && Equals((ObjectId)obj);
Copy link

@ArielTipalti ArielTipalti Apr 1, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
return obj is ObjectId && Equals((ObjectId)obj);
return obj is ObjectId objId && Equals(objId);

@@ -541,7 +576,24 @@ public void ToByteArray(byte[] destination, int offset)
/// <returns>A string representation of the value.</returns>
public override string ToString()
{
return BsonUtils.ToHexString(ToByteArray());
var buffer = new char[24];

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
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);
}

@rishitb-mongodb rishitb-mongodb changed the title Improved ObjectId parsing and ToString() performance CSHARP-5554: Improved ObjectId parsing and ToString() performance Apr 3, 2025
# for free to join this conversation on GitHub. Already have an account? # to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants