【问题标题】:C# performance - pointer to span in a hot loopC# 性能 - 指向热循环中跨度的指针
【发布时间】:2023-01-17 23:57:58
【问题描述】:

我正在寻找 BitConverter 的更快替代品:

但!在“热循环”中:

//i_k_size = 8 bytes 
while (fs.Read(ba_buf, 0, ba_buf.Length) > 0 && dcm_buf_read_ctr < i_buf_reads)
{
    Span<byte> sp_data = ba_buf.AsSpan();
    for (int i = 0; i < ba_buf.Length; i += i_k_size)
    {
        UInt64 k = BitConverter.ToUInt64(sp_data.Slice(i, i_k_size));
    }
 }

我将指针与转换集成在一起的努力使性能变得更差。指针可以用来让它更快吗跨度?

【问题讨论】:

  • i_k_size是否等于sizeof(UInt64)? (即它是 8 吗?)
  • 顺便说一句,不一致的支撑、非常规的缩进和非常规的变量名有点让人分心——至少对我来说是这样,我怀疑其他人可能也有同感。
  • @MatthewWatson 是的。 i_k_size = 8 字节
  • “我看不出大括号有问题”——while 循环的“行尾大括号”与for 循环的“行首大括号”对你来说似乎并不矛盾? (至于“我希望你能回答问题的要点”——如果我的建议有助于让你的问题对其他 10 个用户更有吸引力,那不是更有用吗?)
  • @YuriiPalkovskii,您实际上不能假设您在 .Net Core 3+ 中从 Stream.Read 获得了与您请求的字符一样多的字符(来自 .Net Framework 的重大更改)。你需要了解 Read 返回了多少个字符,并可能继续调用 Read 直到您获得所有数据(或者只是在您的流顶部使用 BinaryReader,这保证了它)。

标签: c# performance loops slice bitconverter


【解决方案1】:

假设 ba_bufbyte[],运行循环的一种非常简单有效的方法如下:

foreach(var value in MemoryMarshal.Cast<byte, ulong>(ba_buf))
   // work with value here 

如果您需要精细化缓冲区(例如,切掉它的一部分),请先在其上使用AsSpan(start, count)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-17
    • 1970-01-01
    • 2012-10-08
    • 2019-09-10
    • 2012-04-01
    • 1970-01-01
    相关资源
    最近更新 更多