﻿# V814\. Decreased performance\. The 'strlen' function was called multiple times inside the body of a loop\.

Анализатор обнаружил конструкцию, которую потенциально можно оптимизировать\. При каждой итерации цикла вызывается функция strlen\(S\) или аналогичная ей\. Строка 'S' не меняется, и значит, её длину можно вычислить заранее\. В некоторых случаях это может дать существенный прирост производительности\.

Рассмотрим первый пример\.

```cpp
for (;;) {
{
  ....
  segment = next_segment + strlen("]]>");
  ....
}
```

Внутри цикла много раз вычисляется длина строки "\]\]\>"\. Конечно, строка короткая и функция strlen\(\) Работает быстро\. Но если цикл выполняет миллионы итераций, можно получить замедление "на ровном месте"\. Этот недочет легко исправить:

```cpp
const size_t suffixLen = strlen("]]>");
for (;;) {
{
  ....
  segment = next_segment + suffixLen;
  ....
}
```

Ещё лучше использовать макрос, на подобии этого:

```cpp
#define LiteralStrLen(S) (sizeof(S) / sizeof(S[0]) - 1)
....
segment = next_segment + LiteralStrLen("]]>");
```

Если это Си\+\+, то можно сделать шаблонную функцию:

```cpp
template <typename T, size_t N>
char (&ArraySizeHelper(T (&array)[N]))[N];

template <typename T, size_t N>
size_t LiteralStrLen(T (&array)[N]) {
  return sizeof(ArraySizeHelper(array)) - 1;
}
....
segment = next_segment + LiteralStrLen("]]>");
```



Рассмотрим второй пример\.

```cpp
for(j=0; j<(int)lstrlen(text); j++)
{
  if(text[j]=='\n')
  {
    lines++;
  }
}
```

Показанный фрагмент кода считает количество строк в тексте\. Этот пример не надуманный, а взят из реального приложения\.

Если текст будет большим, этот алгоритм будет крайне неэффективен\. На каждой итерации цикла, будет вычисляться его длина, чтобы сравнить с ней значение переменной 'j'\.

Быстрый вариант:

```cpp
const int textLen = lstrlen(text);
for(j=0; j<textLen; j++)
{
  if(text[j]=='\n')
  {
    lines++;
  }
}
```