所以我正在研究这个问题,普遍的共识是uint cast版本比0的范围检查更有效.由于代码也在MS的List实现中,我认为它是一个真正的优化.但是,我无法生成代码示例,从而为uint版本带来更好的性能.我尝试了不同的测试,但是我的代码中缺少某些东西,或者我的代码的其他部分使检查的时间相形见绌.我的最后一次尝试是这样的:
class TestType
{
public TestType(int size)
{
MaxSize = size;
Random rand = new Random(100);
for (int i = 0; i < MaxIterations; i++)
{
indexes[i] = rand.Next(0, MaxSize);
}
}
public const int MaxIterations = 10000000;
private int MaxSize;
private int[] indexes = new int[MaxIterations];
public void Test()
{
var timer = new Stopwatch();
int inRange = 0;
int outOfRange = 0;
timer.Start();
for (int i = 0; i < MaxIterations; i++)
{
int x …Run Code Online (Sandbox Code Playgroud) 我正在测试使用SIMU指令和RyuJIT可以得到什么样的加速,我看到了一些我不期望的反汇编指令.我立足代码这个博客帖子从RyuJIT队的凯文·弗雷,以及相关的帖子在这里.这是功能:
static void AddPointwiseSimd(float[] a, float[] b) {
int simdLength = Vector<float>.Count;
int i = 0;
for (i = 0; i < a.Length - simdLength; i += simdLength) {
Vector<float> va = new Vector<float>(a, i);
Vector<float> vb = new Vector<float>(b, i);
va += vb;
va.CopyTo(a, i);
}
}
Run Code Online (Sandbox Code Playgroud)
我正在查询的反汇编部分将数组值复制到Vector<float>.大部分的反汇编与Kevin和Sasha的帖子类似,但我强调了一些额外的指令(以及我的混淆注释),这些指令没有出现在他们的反汇编中:
;// Vector<float> va = new Vector<float>(a, i);
cmp eax,r8d ; <-- Unexpected - Compare a.Length to i?
jae 00007FFB17DB6D5F ; <-- Unexpected - Jump to …Run Code Online (Sandbox Code Playgroud)