Профилирование полного времени выполнения программ «labpas» и «labc»
В ходе выполнения лабораторной работы №1 на языках Паскаль и Си++ была разработана программа, выполняющая интерполяцию данных по методу наименьших квадратов. В ходе выполнения лабораторной работы №2 были проведены некоторые улучшения этой программы и увеличено её быстродействие. Таким образом, в нашем распоряжении имеются две версии программы для каждого языка программирования: исходная и оптимизированная. Оценим общее время выполнения каждой из программ с помощью профилировщика «Sampler».
Для достижения поставленной цели необходимо внести изменения в программы. Для программ на языке Паскаль необходимо добавить модуль «Sampler» в раздел «uses» основной программы и разместить меткиSAMPLE(‘Main.pas’,N) после оператораBEGIN, открывающего тело программы и перед операторомEND, закрывающем его. Для программ на языке Си++ необходимо добавить директиву «#include“Sampler.h”» в начало файла и разместить меткиSAMPLEпосле открывающей и перед закрывающей фигурными скобками функцииMain.
Результаты профилирования всех версий программ приведены ниже:
----------------------------------------------------------------------
Метки Общее время Кол-во прох. Ср. время
----------------------------------------------------------------------
Результат программы на языке Си++ (исходная версия):
----------------------------------------------------------------------
1 : 49 1 : 80 45684.64 1 45684.64
----------------------------------------------------------------------
Результат программы на языке Си++ (оптимизированная версия):
----------------------------------------------------------------------
1 : 49 1 : 80 462.63 1 462.63
----------------------------------------------------------------------
Результат программы на языке Паскаль (исходная версия):
----------------------------------------------------------------------
1 : 10 1 : 20 6652.48 1 6652.48
----------------------------------------------------------------------
Результат программы на языке Паскаль (оптимизированная версия):
----------------------------------------------------------------------
1 : 10 1 : 20 2123.90 1 2123.90
----------------------------------------------------------------------
Полученные результаты существенно отличаются от результатов, полученных с помощью программы «TurboProfiler», в меньшую сторону. Это объясняется тем, что в программе «SAMPLER» расход времени на служебные операции, связанные с замером времени, существенно меньше, чем в программе «TurboProfiler». Таким образом, оценки времени, полученные в ходе этой лабораторной работы, являются более точными.
Детальное профилирование программ «Main_p» и «Main_c»
Профилирование программы на C++
(измерение времен выполнения функциональных участков)
Тело функции «Main» разбивается на некие функциональные участки с помощью метокSAMPLE. Профилирование такой программы позволит оценить время, затрачиваемое в программе на выполнение каждой из таких секций. Текст функцииmainприведён ниже:
voidmain() {
floatx[max];
float y[max];
int n;
float sumx,sumy;
float sumxy, sumx2;
int k;
float resa,resb;
int cycle;
for(cycle = 0; cycle < cyc_count; cycle++) {
SAMPLE;
clrscr();
SAMPLE;
seed = 4.0;
SAMPLE;
get_data(x,y,n);
SAMPLE;
write_data(x,y,n);
SAMPLE;
sumx = 0; sumy = 0; sumxy = 0; sumx2 = 0;
for (k=1; k<=n; k++) {
sumx += x[k];
sumy += y[k];
sumxy += x[k] * y[k];
sumx2 += x[k] * x[k];
}
resa = (sumxy - sumx*sumy/n) / (sumx2 - sumx*sumx/n);
resb = (sumy - resa * sumx) / n;
SAMPLE;
cout << "Approximated with y=ax+b where a = " << resa << ", b=" << resb;
SAMPLE;
}
}
Результаты профилирования такой программы приведены ниже:
----------------------------------------------------------------------
Область программы Общее время Кол-во прох. Ср. время
----------------------------------------------------------------------
Вызов функции очистки экрана 181.87 20 9.09
----------------------------------------------------------------------
Подготовка к генерации данных 8.38 20 0.42
----------------------------------------------------------------------
Генерация данных 205.33 20 10.27
----------------------------------------------------------------------
Вывод данных на экран 114281.16 20 5714.06
----------------------------------------------------------------------
Расчёт результата 28.50 20 1.42
----------------------------------------------------------------------
Вывод результата на экран 687.24 20 34.36
----------------------------------------------------------------------
После профилирования к программе применяются следующие модификации:
исключается вызов функции очистки экрана;
исключается вывод данных на экран
сокращается текст при выводе результата;
Итоги оптимизации приведены в п. 3 настоящего отчёта. Исключение некоторых секций программы позволило сократить время выполнения программы с 45684.64 до 462.63 микросекунд.