Java:为什么计算速度比赋值(int)快?

Kei*_*Man 2 java performance variable-assignment

以下两个版本的相同功能(基本上试图通过强力恢复密码)不会提供相同的性能:

版本1:

private static final char[] CHARS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".toCharArray();
private static final int N_CHARS = CHARS.length;
private static final int MAX_LENGTH = 8;

private static char[] recoverPassword()
{
   char word[];
   int refi, i, indexes[];

   for (int length = 1; length <= MAX_LENGTH; length++)
   {
      refi = length - 1;
      word = new char[length];
      indexes = new int[length];
      indexes[length - 1] = 1;

      while(true)
      {
         i = length - 1;
         while ((++indexes[i]) == N_CHARS)
         {
            word[i] = CHARS[indexes[i] = 0];
            if (--i < 0)
               break;
         }

         if (i < 0)
            break;

         word[i] = CHARS[indexes[i]];

         if (isValid(word))
            return word;
      }
   }
   return null;
}
Run Code Online (Sandbox Code Playgroud)

版本2:

private static final char[] CHARS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".toCharArray();
private static final int N_CHARS = CHARS.length;
private static final int MAX_LENGTH = 8;

private static char[] recoverPassword()
{
   char word[];
   int refi, i, indexes[];

   for (int length = 1; length <= MAX_LENGTH; length++)
   {
      refi = length - 1;
      word = new char[length];
      indexes = new int[length];
      indexes[length - 1] = 1;

      while(true)
      {
         i = refi;
         while ((++indexes[i]) == N_CHARS)
         {
            word[i] = CHARS[indexes[i] = 0];
            if (--i < 0)
               break;
         }

         if (i < 0)
            break;

         word[i] = CHARS[indexes[i]];

         if (isValid(word))
            return word;
      }
   }
   return null;
}
Run Code Online (Sandbox Code Playgroud)

我希望版本2更快(这是唯一的区别):

i = refi;
Run Code Online (Sandbox Code Playgroud)

...与版本1相比:

i = length -1;
Run Code Online (Sandbox Code Playgroud)

然而,情况正好相反:版本1的速度超过3%!有人知道为什么吗?这是由于编译器进行了一些优化吗?

谢谢大家的答案.只是补充说,目标实际上并不是优化这段代码(已经非常优化),而是从编译器/ CPU /架构的角度来理解更多可以解释这种性能差异的内容.你的回答非常有帮助,再次感谢!

Pet*_*rey 5

很难在微基准测试中检查这一点,因为如果不读取生成的机器代码就无法确定代码是如何优化的,即使这样,CPU也可以做很多技巧来优化它.它将RISC样式指令中的x86代码转换为实际执行.

计算只需一个周期,CPU可以同时执行多达三个周期.对L1缓存的访问需要4个周期,对于L2,L3,主存储器需要11,40-75,200个周期.

在许多情况下,存储值以避免简单计算实际上较慢.使用除法和模数的BTW非常昂贵,在微调代码时缓存这个值是值得的.