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

Страницы работы

Содержание работы

Министерство образования и науки Российской Федерации

Федеральное агентство по образованию

Государственное образовательное учреждение

высшего профессионального образования

«Комсомольский-на-Амуре государственный

технический университет»

Факультет компьютерных технологий

Кафедра «МОП ЭВМ»

ЛАБОРАТОРНАЯ РАБОТА №2

по курсу «Метрология, стандартизация и сертификация»

Студент группы 4ВС-1                                                                                          Зимин А.В.

Преподаватель:                                                                                                   Муратова Т.А.

Комсомольск-на-Амуре

2006


Тема:                       «Оптимизация программного кода с использованием TURBO PROFILER»

Цель работы:        Научиться оптимизировать программу, используя статистические данные

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

Выполнение:         В качестве оптимизируемой выбрана программа, реализующая решение квадратного уравнения а*х2+в*х+с=0. Коэффициенты a и b - фиксированы и равны 1 и -3 соответственно.  Коэффициент c задан массивом из десяти чисел (т.е. всего необходимо решить десять уравнений). Требуется вывести на печать все исходные данные (значения коэффициентов) и результаты решения десяти уравнений. В случае если дискриминант уравнения будет иметь отрицательное значение, программа должна выводить на печать соответствующее сообщение.
Исходный текст программы(l2.срр)

#include<stdio.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=0;

float x1,x2,d;

while (i<10)

{

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

printf("a = %d, b = %d, c = %d:\n", a, b, c[i]);

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

else

{

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

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

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

}

i++;

}

}

Статистические данные исходной программы(l2.срр)

Execution Profile

Total time: 3.2320 sec

% of total: 97 %

Run: 10 of 10

Filter: All

Show: Time and counts

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

#L2#16                   60   8% |+++++++++++

1.1025 sec  34% |*******************************************

#L2#11                  100  14% |++++++++++++++++++

1.0203 sec  32% |******************************************

#L2#10                  100  14% |++++++++++++++++++

0.9704 sec  30% |****************************************

#L2#20                   10   1% |+

0.0623 sec   1% |**

#L2#15                   60   8% |+++++++++++

0.0012 sec  <1% |

#L2#14                   60   8% |+++++++++++

0.0010 sec  <1% |

#L2#18                  100  14% |++++++++++++++++++

0.0009 sec  <1% |

#L2#7                   110  15% |++++++++++++++++++++

0.0008 sec  <1% |

#L2#9                   100  14% |++++++++++++++++++

0.0008 sec  <1% |

#L2#5                    10   1% |+

0.0000 sec  <1% |

Рис.1 Окно Файлы

По данным статистики, узкими местами в программе являются области:

#L2#16           printf("Результат: x1=%.3f, x2=%.3f\n\n",x1 ,x2);

#L2#11           if  (d<0) printf("Дискриминант меньше нуля!\n\n");

#L2#10           printf("a = %d, b = %d, c = %d:\n", a, b, c[i]);

Все вышеперечисленные области включают оператор printf. Для оптимизации этих строчек воспользуемся более быстрым оператором вывода cprintf. Также в ходе этого изменения мы должны избежать обращение к файлу stdout (рис. 1). Кроме этого будет целесообразно убрать в операторах  вывода символы перевода строки, отрицательно сказывающиеся на эффективности областей.

Первое изменение (iz1.cpp)

Таким образом, меняем малоэффективные строки (16, 11, 10) на следующие:

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

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

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

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

Execution Profile

Total time: 0.7090 sec

% of total: 86 %

Run: 10 of 10

Filter: All

Show: Time and counts

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

#IZ1#11                 100  14% |+++++++++++++++++

0.2314 sec  37% |*******************************************

#IZ1#16                  60   8% |++++++++++

0.1872 sec  30% |*************************************

#IZ1#10                 100  14% |+++++++++++++++++

0.1739 sec  28% |**********************************

#IZ1#20                  10   1% |+

0.0150 sec   2% |**

#IZ1#9                  100  14% |+++++++++++++++++

0.0020 sec  <1% |

#IZ1#7                  110  15% |++++++++++++++++++

0.0018 sec  <1% |

#IZ1#18                 100  14% |+++++++++++++++++

0.0016 sec  <1% |

Похожие материалы

Информация о работе