Kei*_*Man 2 java performance variable-assignment
以下两个版本的相同功能(基本上试图通过强力恢复密码)不会提供相同的性能:
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)
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 /架构的角度来理解更多可以解释这种性能差异的内容.你的回答非常有帮助,再次感谢!
键
很难在微基准测试中检查这一点,因为如果不读取生成的机器代码就无法确定代码是如何优化的,即使这样,CPU也可以做很多技巧来优化它.它将RISC样式指令中的x86代码转换为实际执行.
计算只需一个周期,CPU可以同时执行多达三个周期.对L1缓存的访问需要4个周期,对于L2,L3,主存储器需要11,40-75,200个周期.
在许多情况下,存储值以避免简单计算实际上较慢.使用除法和模数的BTW非常昂贵,在微调代码时缓存这个值是值得的.
| 归档时间: |
|
| 查看次数: |
186 次 |
| 最近记录: |