同じ機能の次の 2 つのバージョン (基本的には力ずくでパスワードを回復しようとする) では、同じパフォーマンスが得られません。
バージョン 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;
}
バージョン 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;
}
私はバージョン 2 が高速であることを期待しています (それが唯一の違いです)。
i = refi;
...バージョン 1 との比較:
i = length -1;
しかし、それは逆です: バージョン 1 は 3% 以上高速です! 誰かが理由を知っていますか?それは、コンパイラによって行われたいくつかの最適化によるものですか?
皆様、ここまでご回答いただきありがとうございました。付け加えておきますが、実際にはこのコードを最適化することが目的ではなく (既にかなり最適化されています)、コンパイラ / CPU / アーキテクチャの観点から、そのようなパフォーマンスの違いを説明できるものを理解することがさらに重要です。あなたの答えはとても役に立ちました。
鍵