Учитывая Visual Studio 2019,. NET Проект Framework 4.7.2 (консольное приложение для тестирования). Пакет Nuget System.Memory установлен для получения Span.
. Экспериментируйте с новым Span / ReadOnlySpan, чтобы повысить производительность в других проектах. Я установил простой кусок кода:
public class Tester
{
public string ParseNameSubstring(string name)
{
var firstNullIndex = name.IndexOf('\0');
return (firstNullIndex == -1) ? name : name.Substring(0, firstNullIndex);
}
public ReadOnlySpan<char> ParseNameSpan(ReadOnlySpan<char> name)
{
var firstNullIndex = name.IndexOf('\0');
return (firstNullIndex == -1) ? name : name.Slice(0, firstNullIndex);
}
}
static void Main(string[] args)
{
var foo = "foo bar \0 blabla";
Tester t = new Tester();
Stopwatch sw = new Stopwatch();
sw.Start();
string str = t.ParseNameSpan(foo.AsSpan()).ToString();
sw.Stop();
Console.WriteLine(str);
Console.WriteLine(sw.ElapsedMilliseconds);
sw.Restart();
var str2 = t.ParseNameSubstring(foo);
sw.Stop();
Console.WriteLine(str2);
Console.WriteLine(sw.ElapsedMilliseconds);
}
вывод:
foo bar
19
foo bar
0
Это правильное использование Span / ReadOnlySpan? Как кажется, он сильно замедляется (возможно, с помощью .AsSpan () и .ToString ())?
Неявное неявное приведение к строке недоступно в. NET Framework 4.7.2 или я пропустил пакет nuget?
обновление : действительно, неверный тест, но правильное ли это использование span?
update2 : краткое резюме :
- Use. NET Core /. Net Standard, as. NET Framework имеет меньше оптимизаций.
- Не использовать .ToString (), работать напрямую с ReadOnlySpan, где это возможно.