Сишные трюки от мыщъха


не оптимизированный вариант с инвариантом в теле цикла


С точки зрения программиста очевидно, что функция strelen _не_ модифицирует строку s, а потому может быть вычислена лишь однажды. Только вот компилирует этого не знает, придерживаясь принципа: все, что может быть передано по ссылке, _может_ быть изменено, поэтому strlen(s) заново вычисляется на _каждой_ итерации цикла, что при длинных строках снижает производительность более чем на порядок!

Исправленный вариант выглядит так:

n = strlen(s);

for(a = 0, x = 0; a < n; a++)

{

       x += s[a];

}



Содержание раздела