- Notifications
You must be signed in to change notification settings - Fork 2.6k
DateTime.ToString() Fast Track for RFC1123 #7891
Conversation
@tarekgh , I measured a more than 50% reduction in allocated bytes and 75% reduction in allocations. |
return FastFormatRoundtrip(dateTime, offset); | ||
} | ||
| ||
if (format[0] == 'r' || format[0] == 'R') { |
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.
Switch statement over format[0]
is likely to generate better code.
| ||
internal static readonly DateTimeFormatInfo FormatInfo = CultureInfo.InvariantCulture.DateTimeFormat; | ||
internal static readonly string[] AbbreviatedMonthNames = FormatInfo.AbbreviatedMonthNames; | ||
internal static readonly string[] AbbreviatedDayNames = FormatInfo.AbbreviatedDayNames; |
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.
Nit: these three fields should all probably be prefixed with "Invariant"
} | ||
| ||
| ||
private static void AppendTimeOfDay(StringBuilder result, DateTime dateTime) |
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.
Nit: the name should probably include format information, e.g. AppendHHmmssTimeOfDay, or something along those lines.
internal static string FastFormatRfc1123(DateTime dateTime, TimeSpan offset, DateTimeFormatInfo dtfi) | ||
{ | ||
// ddd, dd MMM yyyy HH:mm:ss GMT | ||
StringBuilder result = StringBuilderCache.Acquire(); |
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.
Maybe:
const int Rfc1123Length = 29; StringBuilder result = StringBuilderCache.Acquire(Rfc123Length);
?
Good feedback. I incorporated it all. |
{ | ||
StringBuilder result = StringBuilderCache.Acquire(); | ||
// yyyy-MM-ddTHH:mm:ss.fffffffK | ||
const int roundTrimFormatLength = 28; |
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.
Nit: Trim => Trip
| ||
result.Append(InvariantAbbreviatedDayNames[(int)dateTime.DayOfWeek]); | ||
result.Append(','); | ||
result.Append(' '); |
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.
you may append both in on append call .Append(", ");
case 'o': | ||
return FastFormatRoundtrip(dateTime, offset); | ||
case 'R': | ||
case 'r': |
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.
I am seeing in the ExpandPredefinedFormat we have the following code, but it looks you don't handle that
case 'r': case 'R': // RFC 1123 Standard if (offset != NullOffset) { // Convert to UTC invariants mean this will be in range dateTime = dateTime - offset; } else if (dateTime.Kind == DateTimeKind.Local) { InvalidFormatForLocal(format, dateTime); } dtfi = DateTimeFormatInfo.InvariantInfo; break;
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.
Yeah, that is special handling for DateTimeOffset I need to apply. Do you know what InvalidFormatForLocal(...) is for and why it exists and is empty? MDA?
@dotnet-bot test Linux ARM Emulator Cross Debug Build please |
@dotnet-bot test Linux ARM Emulator Cross Debug Build please |
@tarekgh , does that last update look good and address your feedback? |
LGTM. |
Addresses issue https://github.com/dotnet/coreclr/issues/7881 . I still need to complete full testing but it looks good so far.