Заметки / Функция в условии цикла

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);// и пробелами, оставляя последним символом "0"

 // Тестовый цикл
 for (int i=0; i<strlen_c (txt); i++)
 {
 }

 printf ("%d\n\n", c);// вывод переменной "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++)
{
}

?>

Особенно оптимизация скажется на производительности, если цикл вложенный.

29.08.2017