gpt4 book ai didi

c# - Encoding.UTF8.GetBytes with Span - GetByteCount 或 try/catch 哪个对性能更好

转载 作者:太空狗 更新时间:2023-10-30 00:59:39 24 4
gpt4 key购买 nike

我正在尝试对 KeyValuePair<string, string> 进行编码到 UTF-8 key='value'使用 Span<byte> .NET Core 2.1 中的重载。

谁写了 GetBytes(ReadOnlySpan<char> chars, Span<byte> bytes)方法显然是尤达的弟子,因为没有TryGetBytes替代方案,这很奇怪,因为 Utf8Formatter 为所有非字符串原始类型提供了 TryWrite。

所以我有两种选择来编写扩展方法来执行此操作。

选项 1:

public static bool TryGetBytes(this Encoding encoding, ReadOnlySpan<char> str, Span<byte> bytes, out int written)
{
try
{
written = Encoding.UTF8.GetBytes(str, span);
return true;
}
catch (ArgumentException)
{
written = 0;
return false;
}

选项 2:

public static bool TryGetBytes(this Encoding encoding, ReadOnlySpan<char> str, Span<byte> bytes, out int written)
{
if (encoding.GetByteCount(str) > span.Length)
{
written = 0;
return false;
}

written = Encoding.UTF8.GetBytes(str, span);
return true;
}

假设“空间不足”的情况在热路径上会相当频繁地发生(例如,50 次中有 1 次),哪个对性能更好?

最佳答案

当我写这个问题时,我想“你为什么不直接使用 BenchmarkDotNet 呢?”所以我做到了。

答案:GetByteCounttry/catch 快两个数量级。

结果如下:


BenchmarkDotNet=v0.11.3, OS=Windows 10.0.17763.253 (1809/October2018Update/Redstone5)
Intel Core i7-7700HQ CPU 2.80GHz (Kaby Lake), 1 CPU, 8 logical and 4 physical cores
.NET Core SDK=2.2.102
[Host] : .NET Core 2.2.1 (CoreCLR 4.6.27207.03, CoreFX 4.6.27207.03), 64bit RyuJIT
DefaultJob : .NET Core 2.2.1 (CoreCLR 4.6.27207.03, CoreFX 4.6.27207.03), 64bit RyuJIT


|   Method |        Mean |      Error |    StdDev | Gen 0/1k Op | Gen 1/1k Op | Gen 2/1k Op | Allocated Memory/Op |
|--------- |------------:|-----------:|----------:|------------:|------------:|------------:|--------------------:|
| TryCatch | 40,985.9 ns | 800.034 ns | 785.74 ns | 0.4272 | - | - | 1392 B |
| TryCount | 366.5 ns | 8.450 ns | 10.38 ns | - | - | - | - |

关于c# - Encoding.UTF8.GetBytes with Span - GetByteCount 或 try/catch 哪个对性能更好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54503668/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com