为什么for循环初始化中的条件比循环内部更快?

问题描述:

我做了一些优化,并发现这一点:为什么for循环初始化中的条件比循环内部更快?

for (int x = -1; x < 2; x++) 
{ 
    for (int y = -1; y < 2 ; y++) 
    { 
     if (((x * x)^(y * y)) != 1) 
     { 
      continue; 
     } 
    } 
} 

时间超过两倍的时间更多,因为这跑:

for (int x = -1; x < 2; x++) 
{ 
    for (int y = -1; y < 2 && ((x * x)^(y * y)) == 1; y++) 
    { 

    } 
} 

这到底是怎么回事?

目的是避免对角(-1,-1; -1,1 ...)和原点(0,0)字段

+2

你是如何测试它的? – Steve

+0

@Steve连续10次运行两个版本1亿次。调试模式 – user3488765

+1

定时测试最好使用发布版本进行优化,而不是使用调试器,因为最终是最重要的。 – hatchet

第二代码结束时内环((x * x)^(y * y)) != 1,而第一代码只跳过内循环的一次迭代。由于他们不会做同样的事情,所以所有的赌注都在比较表现。

+4

哎呀,我是个白痴,.. – user3488765