Министерство образования и науки Российской Федерации
Федеральное агентство по образованию
Государственное образовательное учреждение
высшего профессионального образования
«Комсомольский-на-Амуре государственный
технический университет»
Факультет компьютерных технологий
Кафедра «МОП ЭВМ»
ЛАБОРАТОРНАЯ РАБОТА №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% |
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.