Оптимизация программного кода с использованием TURBO PROFILER. Оптимизация с помощью системы Turbo Profiler программного модуля, написанного на языке СИ, страница 2

#IZ1#15                  60   8% |++++++++++

0.0011 sec  <1% |

#IZ1#14                  60   8% |++++++++++

0.0009 sec  <1% |

#IZ1#5                   10   1% |+

0.0002 sec  <1% |

Рис.2 Окно файлы (после первого изменения)

Оптимизированные строки стали работать значительно быстрее. Надо заметить, что они по-прежнему являются узкими местами программы, но оптимизировать их больше не представляется возможным. Также в результате первого изменения удалось избежать обращения программы к файлам, не повлияв при этом на результат ее работы (рис. 2). Оптимизация положительно сказалась на времени работы всей программы, которое сократилось с 3.2320 до 0.7090 секунд. 

Второе изменение (iz2.cpp)

Обратим внимание на строку:

#IZ1#9                        d=pow(b,2)-4*a*c[i];

Время, затраченное на выполнение этой области достаточно мало (0.0020 сек), однако нельзя упускать возможности оптимизировать данную строку. Предположим, что операция умножения b*b будет работать быстрее оператора возведения в степень pow(b,2). Итак, заменим строку 9 строкой:

#IZ2#9                        d=b*b-4*a*c[i];

Статистика после второго изменения(iz2.cpp)

Execution Profile

Total time: 0.6607 sec

% of total: 87 %

Run: 10 of 10

Filter: All

Show: Time and counts

Sort: Frequency       Pass count: +++   Time: ***

#IZ2#10                 100  14% |+++++++++++++++++

0.2172 sec  37% |*******************************************

#IZ2#16                  60   8% |++++++++++

0.1805 sec  31% |**************************************

#IZ2#11                 100  14% |+++++++++++++++++

0.1111 sec  19% |***********************

#IZ2#20                  10   1% |+

0.0677 sec  11% |**************

#IZ2#18                 100  14% |+++++++++++++++++

0.0001 sec  <1% |

#IZ2#7                  110  15% |++++++++++++++++++

0.0000 sec  <1% |

#IZ2#9                  100  14% |+++++++++++++++++

0.0000 sec  <1% |

#IZ2#14                  60   8% |++++++++++

0.0000 sec  <1% |

#IZ2#15                  60   8% |++++++++++

0.0000 sec  <1% |

#IZ2#5                   10   1% |+

0.0000 sec  <1% |

Строка 9 после оптимизации стала работать незначительно быстрее. Изменение также лишь немного уменьшило время работы всей программы, которое сократилось до 0.6607 секунд. Согласно статистике после второго изменения, узким местом в программе является строка 20. Содержание этой строки – это завершение программы «}». Очевидно, что оптимизировать эту строку не удастся.

Третье изменение (iz3.cpp)

Заметим, что строки 18 (увеличение счетчика i++) и 7 (голова цикла while), хотя и являются эффективными, вызываются достаточно часто. Попробуем заменить цикл while, используемый при подсчете и выводе результатов в программе, циклом for. Измененный код выглядит следующим образом:

#include<conio.h>

#include<math.h>

void main(void)

{

int a=1,b=-3,c[10] = {1, 3, -2, 5, -4, 0, 6, 8, -1, -3},i;

float x1,x2,d;

for (i=0; i<10; i++)

{

d=b*b-4*a*c[i];

cprintf("a = %d, b = %d, c = %d: ", a, b, c[i]);

if  (d<0) cprintf("Дискриминант меньше нуля!  ");

else

{

x1=(-b-sqrt(d))/(2*a);

x2=(-b+sqrt(d))/(2*a);

cprintf("Результат: x1=%.3f, x2=%.3f  ",x1 ,x2);

}

}

}

Статистика после третьего изменения (iz3.cpp)

Execution Profile

Total time: 0.4238 sec

% of total: 96 %

Run: 10 of 10

Filter: All

Show: Time and counts

Sort: Frequency       Pass count: +++   Time: ***

#IZ3#10                 100  19% |+++++++++++++++++++

0.1906 sec  46% |*******************************************

#IZ3#11                 100  19% |+++++++++++++++++++

0.0937 sec  22% |**********************

#IZ3#19                  10   1% |+

0.0622 sec  15% |***************

#IZ3#16                  60  11% |+++++++++++

0.0609 sec  14% |**************

#IZ3#9                  100  19% |+++++++++++++++++++

0.0001 sec  <1% |

#IZ3#14                  60  11% |+++++++++++

0.0000 sec  <1% |

#IZ3#15                  60  11% |+++++++++++

0.0000 sec  <1% |

#IZ3#7                   10   1% |+

0.0000 sec  <1% |

#IZ3#5                   10   1% |+

0.0000 sec  <1% |

Теперь строчка 7 (голова цикла) выполняется значительно реже (процент от общего числа вызовов сократился с 15% до 1%). Необходимость в отдельной строке с командой i++ при использовании цикла for отпала. Это привело к улучшению эффективности работы всей программы, время выполнения которой уменьшилось до 0.4238 секунд.

Вывод

В ходе оптимизации программного кода с помощью системы Turbo Profiler были поэтапно произведены изменения в программе, сравнены статистические данные.  Это помогло обнаружить малоэффективные места программы и, если это было возможно, улучшить их. В итоге, в результате трех изменений, время работы программы уменьшилось с  3.2320 секунд до 0.4238 секунд, т.е. примерно в 7,6 раз.