gpt4 book ai didi

C# 性能 - 指向热循环中跨度的指针

转载 作者:行者123 更新时间:2023-12-05 09:25:44 24 4
gpt4 key购买 nike

我正在寻找一个比 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));
}
}

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

下面是基准测试:指针 2 数组快 2 倍

实际上我希望使用这个代码而不是 BitConverter:

public static int l_1gb = 1073741824;
static unsafe void Main(string[] args)
{
Random rnd = new Random();
Stopwatch sw1 = new();
sw1.Start();
byte[] k = new byte[8];

fixed (byte* a2rr = &k[0])
{
for (int i = 0; i < 1000000000; i++)
{
rnd.NextBytes(k);
//UInt64 p1 = BitConverter.ToUInt64(k);
//time: 10203.824
//time: 10508.981
//time: 10246.784
//time: 10285.889

//UInt64* uint64ptr = (UInt64*)a2rr;
//x2 performance !
UInt64 p2 = *(UInt64*)a2rr;

//time: 4609.814
//time: 4588.157
//time: 4634.494
}
}
Console.WriteLine($"time: {Math.Round(sw1.Elapsed.TotalMilliseconds, 3)}");
}

最佳答案

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

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

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

关于C# 性能 - 指向热循环中跨度的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75148899/

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