Skip to content

Commit df84d79

Browse files
committed
Optimise MySqlBulkCopy.WriteBytes.
This uses a couple of techniques illustrated in https://devblogs.microsoft.com/dotnet/performance-improvements-in-net-5/.
1 parent 4a38169 commit df84d79

File tree

1 file changed

+4
-4
lines changed

1 file changed

+4
-4
lines changed

src/MySqlConnector/MySqlBulkCopy.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -634,19 +634,19 @@ static bool WriteSubstring(string value, ref int inputIndex, ref Encoder? utf8En
634634

635635
static bool WriteBytes(ReadOnlySpan<byte> value, ref int inputIndex, Span<byte> output, out int bytesWritten)
636636
{
637+
ReadOnlySpan<byte> hex = new byte[] { (byte) '0', (byte) '1', (byte) '2', (byte) '3', (byte) '4', (byte) '5', (byte) '6', (byte) '7', (byte) '8', (byte) '9', (byte) 'A', (byte) 'B', (byte) 'C', (byte) 'D', (byte) 'E', (byte) 'F' };
637638
bytesWritten = 0;
638639
for (; inputIndex < value.Length && output.Length > 2; inputIndex++)
639640
{
640-
WriteNibble(value[inputIndex] >> 4, output);
641-
WriteNibble(value[inputIndex] & 0xF, output.Slice(1));
641+
var by = value[inputIndex];
642+
output[0] = hex[(by >> 4) & 0xF];
643+
output[1] = hex[by & 0xF];
642644
output = output.Slice(2);
643645
bytesWritten += 2;
644646
}
645647

646648
return inputIndex == value.Length;
647649
}
648-
649-
static void WriteNibble(int value, Span<byte> output) => output[0] = value < 10 ? (byte) (value + 0x30) : (byte) (value + 0x57);
650650
}
651651

652652
private static readonly char[] s_specialCharacters = new char[] { '\t', '\\', '\n' };

0 commit comments

Comments
 (0)