首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Encoding.UTF8.GetBytes with Span - GetByteCount或try/catch哪个更好

使用Encoding.UTF8.GetBytes with Span - GetByteCount或try/catch哪个更好
EN

Stack Overflow用户
提问于 2019-02-03 14:05:21
回答 1查看 1.5K关注 0票数 6

我正在尝试使用.NET Core2.1中的Span<byte>重载将KeyValuePair<string, string>编码为UTF-8 key='value'

编写GetBytes(ReadOnlySpan<char> chars, Span<byte> bytes)方法的人显然是Yoda的追随者,因为没有TryGetBytes替代方法,这很奇怪,因为Utf8Formatter为所有非字符串原始类型提供了TryWrite。

因此,我有两种选择来编写扩展方法来实现这一点。

选项1:

代码语言:javascript
运行
AI代码解释
复制
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:

代码语言:javascript
运行
AI代码解释
复制
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次)命中,那么哪种情况对性能更好?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-03 14:24:17

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

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

结果如下:

代码语言:javascript
运行
AI代码解释
复制
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
代码语言:javascript
运行
AI代码解释
复制
|   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 |           - |           - |           - |                   - |
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54503668

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档