Заметки / Функция в условии цикла
|
C++, PHP
|
|
При создании цикла можно предположить, что параметры определяются только один раз и написать что-то подобное:
for (int i=0; i<strlen (txt); i++)
{
}
Но это не так. Функция "strlen" будет вызываться при каждом выполнении цикла:
#include <windows.h>
#include <stdio.h>
int c=0;int strlen_c (char txt [1024])
{
c++; return strlen (txt);
}
int main (int argc, char *argv[])
{
char txt [1024]; memset (txt, 0, 1024); memset (txt, 32, 1023); for (int i=0; i<strlen_c (txt); i++)
{
}
printf ("%d\n\n", c); system ("pause");}
Данный пример выдаст результат равный длине строки:
Правильнее будет посчитать ограничитель цикла заранее:
int sl=strlen (txt);
for (int i=0; i<sl; i++)
{
}
В случае с другими языками программирования, скорее всего, утверждение так же верно. Например, с PHP:
<?php
$c=0;// глобальный счётчик
// Тестовая функция
function strlen_c ($txt)
{
global $c;
$c++;// подсчёт выполнений функции
return strlen ($txt);
}
$txt=str_repeat (" ", 1023);// текстовая переменная
// Обычный цикл
for ($i=0; $i<strlen ($txt); $i++)
{
}
// Тестовый цикл
for ($i=0; $i<strlen_c ($txt); $i++)
{
}
print $c;// вывод переменной "c" - 1024
// Оптимальнее
$sl=strlen ($txt);
for ($i=0; $i<strlen ($txt); $i++)
{
}
?>
Особенно оптимизация скажется на производительности, если цикл вложенный.
|
|