Если у вас есть что-то вроде
int stats[256]; while (p<end) stats[*p++]++;
static int stats[256]; while (p<end) stats[*p++]++;
вы на самом деле не сравниваете одно и то же, потому что для первого случая вы не выполняете инициализацию вашего массива. Написанная явно вторая строка эквивалентна
static int stats[256] = { 0 }; while (p<end) stats[*p++]++;
Таким образом, чтобы быть честным, сначала прочитайте
int stats[256] = { 0 }; while (p<end) stats[*p++]++;
Ваш компилятор может вывести гораздо больше вещей, если у него есть переменные в известном состоянии.
Теперь может быть преимущество времени выполнения static
, так как инициализация выполняется во время компиляции (или запуска программы).
Чтобы проверить, компенсирует ли это ваше различие, вы должны запустить одну и ту же функцию со статическим объявлением и циклом несколько раз, чтобы увидеть, исчезает ли различие, если ваше число вызовов увеличивается.
Но, как уже говорили другие, лучше всего проверить ассемблер, который создает ваш компилятор, чтобы увидеть, насколько эффективны различия в производимом коде.