Avoid allocations in .Parse methods (#3760)

* Avoid allocations in .Parse methods

Use the Span overloads of the Parse methods when possible to avoid string allocations and remove one unnecessarry array allocation

* Avoid another string allocation
This commit is contained in:
Berkan Diler 2022-10-19 01:31:34 +02:00 committed by GitHub
parent a6cd044f0f
commit c40c3905e2
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 10 additions and 11 deletions

View file

@ -129,7 +129,7 @@ namespace Ryujinx.Common
private static (Assembly, string) ResolveManifestPath(string filename) private static (Assembly, string) ResolveManifestPath(string filename)
{ {
var segments = filename.Split(new[] { '/' }, 2, StringSplitOptions.RemoveEmptyEntries); var segments = filename.Split('/', 2, StringSplitOptions.RemoveEmptyEntries);
if (segments.Length >= 2) if (segments.Length >= 2)
{ {

View file

@ -918,7 +918,7 @@ namespace Ryujinx.HLE.HOS.Diagnostics.Demangler
return -1; return -1;
} }
return int.Parse(part.Substring(0, numberLength)); return int.Parse(part.AsSpan(0, numberLength));
} }
private string ParseNumber(bool isSigned = false) private string ParseNumber(bool isSigned = false)

View file

@ -816,11 +816,11 @@ namespace Ryujinx.HLE.HOS.Services.Nfc.Nfp
Reserved = new Array57<byte>() Reserved = new Array57<byte>()
}; };
modelInfo.CharacterId = BinaryPrimitives.ReverseEndianness(ushort.Parse(context.Device.System.NfpDevices[i].AmiiboId.Substring(0, 4), NumberStyles.HexNumber)); modelInfo.CharacterId = BinaryPrimitives.ReverseEndianness(ushort.Parse(context.Device.System.NfpDevices[i].AmiiboId.AsSpan(0, 4), NumberStyles.HexNumber));
modelInfo.CharacterVariant = byte.Parse(context.Device.System.NfpDevices[i].AmiiboId.Substring(4, 2), NumberStyles.HexNumber); modelInfo.CharacterVariant = byte.Parse(context.Device.System.NfpDevices[i].AmiiboId.AsSpan(4, 2), NumberStyles.HexNumber);
modelInfo.Series = byte.Parse(context.Device.System.NfpDevices[i].AmiiboId.Substring(12, 2), NumberStyles.HexNumber); modelInfo.Series = byte.Parse(context.Device.System.NfpDevices[i].AmiiboId.AsSpan(12, 2), NumberStyles.HexNumber);
modelInfo.ModelNumber = ushort.Parse(context.Device.System.NfpDevices[i].AmiiboId.Substring(8, 4), NumberStyles.HexNumber); modelInfo.ModelNumber = ushort.Parse(context.Device.System.NfpDevices[i].AmiiboId.AsSpan(8, 4), NumberStyles.HexNumber);
modelInfo.Type = byte.Parse(context.Device.System.NfpDevices[i].AmiiboId.Substring(6, 2), NumberStyles.HexNumber); modelInfo.Type = byte.Parse(context.Device.System.NfpDevices[i].AmiiboId.AsSpan(6, 2), NumberStyles.HexNumber);
context.Memory.Write(outputPosition, modelInfo); context.Memory.Write(outputPosition, modelInfo);

View file

@ -122,9 +122,8 @@ namespace Ryujinx.HLE.HOS.Tamper
for (int nybbleIndex = 0; nybbleIndex < wordSize; nybbleIndex++) for (int nybbleIndex = 0; nybbleIndex < wordSize; nybbleIndex++)
{ {
int index = wordIndex * wordSize + nybbleIndex; int index = wordIndex * wordSize + nybbleIndex;
string byteData = word.Substring(nybbleIndex, 1);
instruction[index] = byte.Parse(byteData, NumberStyles.HexNumber, CultureInfo.InvariantCulture); instruction[index] = byte.Parse(word.AsSpan(nybbleIndex, 1), NumberStyles.HexNumber, CultureInfo.InvariantCulture);
} }
} }

View file

@ -132,7 +132,7 @@ namespace Ryujinx.HLE.Loaders.Mods
{ {
if (str[0] == '0' && (str[1] == 'x' || str[1] == 'X')) if (str[0] == '0' && (str[1] == 'x' || str[1] == 'X'))
{ {
return int.TryParse(str.Substring(2), System.Globalization.NumberStyles.HexNumber, null, out value); return int.TryParse(str.AsSpan(2), System.Globalization.NumberStyles.HexNumber, null, out value);
} }
else else
{ {

View file

@ -54,7 +54,7 @@ namespace Ryujinx.HLE.Utilities
for (int index = 0; index < bytesInHex; index++) for (int index = 0; index < bytesInHex; index++)
{ {
output[index] = byte.Parse(hexString.Substring(index * 2, 2), NumberStyles.HexNumber); output[index] = byte.Parse(hexString.AsSpan(index * 2, 2), NumberStyles.HexNumber);
} }
return output; return output;