【发布时间】:2017-03-09 12:10:51
【问题描述】:
我目前正在考虑移植我的 metro hash implementon 以使用 C#7 功能,因为有几个部分可能会从 ref locals 中受益以提高性能。
哈希在 ulong[4] 数组上进行计算,但结果是 16 byte 数组。目前我正在将ulong 数组复制到结果byte 缓冲区,但这需要一些时间。
所以我想知道System.Runtime.CompilerServices.Unsafe 在这里使用是否安全:
var result = new byte[16];
ulong[] state = Unsafe.As<byte[], ulong[]>(ref result);
ref var firstState = ref state[0];
ref var secondState = ref state[1];
ulong thirdState = 0;
ulong fourthState = 0;
上面的代码 sn-p 意味着我将结果缓冲区也用于部分状态计算,而不仅仅是用于最终输出。
我的单元测试是成功的,根据 benchmarkdotnet 跳过块复制将导致 20% 性能提升,这足以让我确定使用它是否正确。
【问题讨论】:
-
欢迎来到这里,第一个问题很好!
-
您正在做的是通过结构进行转换的旧“技巧”(这个stackoverflow.com/a/35841815/613130)...如果您检查
state.Length,您会发现它是“错误的” . -
你发现的仍然非常有趣的库:-)
-
感谢您的回答,我知道显式结构技巧,但实际上并没有建立连接,它实际上与 Unsafe.As 相同。
-
@Tornhoof
Unsafe.As<>不需要这个技巧,但最终它会做同样的事情。它重新解释作为参数传递给另一种类型的内容。在 ILAsm 中这很容易:ldarg.0; ret:-) 无事可做 :-)