c# - 优化对 2 个字节数组求和
问题描述
我正在遍历一个字节数组并在 for 循环中添加另一个字节数组的值。
var random = new Random();
byte[] bytes = new byte[20_000_000];
byte[] bytes2 = new byte[20_000_000];
for (int i = 0; i < bytes.Length; i++)
{
bytes[i] = (byte)random.Next(255);
}
for (int i = 0; i < bytes.Length; i++)
{
bytes2[i] = (byte)random.Next(255);
}
//how to optimize the part below
for (int i = 0; i < bytes.Length; i++)
{
bytes[i] += bytes2[i];
}
有什么方法可以加快这个过程,所以它可以比线性更快。
解决方案
你可以使用Vector
:
static void Add(Span<byte> dst, ReadOnlySpan<byte> src)
{
Span<Vector<byte>> dstVec = MemoryMarshal.Cast<byte, Vector<byte>>(dst);
ReadOnlySpan<Vector<byte>> srcVec = MemoryMarshal.Cast<byte, Vector<byte>>(src);
for (int i = 0; i < dstVec.Length; ++i)
{
dstVec[i] += srcVec[i];
}
for (int i = dstVec.Length * Vector<byte>.Count; i < dst.Length; ++i)
{
dst[i] += src[i];
}
}
如果您在此处使用指针来对齐其中一个数组,速度会更快。
推荐阅读
- php - Laravel:试图获取非对象的属性
- django - IBM-Cloud Django 应用程序与 APP-ID 的集成
- mysql - 如何构造 SQL 正则表达式:查找包含相同开头和结尾但内部组件可变的字符串;并一无所有
- java - 扫描仪输入值并未全部存储
- angular - Angular 构建错误 - 可注入调用“emake 装饰器”
- excel - 根据工作表行中的关系数据创建依赖组合框
- arrays - Coldfusion 使用 ArrayAppend 和 cfloop 创建 Json
- android - Android studio:Android P 设备上的 USB 调试永远卡住了
- java - 非易失性字段何时写入主存储器
- c# - 如何在 ASP.NET MVC RazorPage 上使用 AJAX