ТЕХНИКА ОПТИМИЗАЦИИ ПРОГРАММ

       

Обработка результатов измерений


Непосредственные результаты замеров времени исполнения программы в "сыром" виде, как было показано выше, ни на что ни годны. Очевидно, перед использованием их следует обработать. Как минимум откинуть пограничные значения, вызванные нерегулярными наведенными эффектами (ну, например, в самый ответственный для профилировки момент, операционная система принялась что-то сбрасывать на диск), а затем… Затем перед нами встает Буриданова проблема. Мы будет должны либо выбрать результат с минимальным временем исполнения – как наименее подвергнувшийся пагубному влиянию многозадачности, либо же вычислить наиболее типичное время выполнения – как время выполнения в реальных, а не идеализированных "лабораторных" условиях.

Мной опробован и успешно применяется компромиссный вариант, комбинирующий оба этих метода. Фактически я предлагаю вам отталкиваться от среде минимального времени исполнения. Сам алгоритм в общих чертах выглядит так: мы делаем N прогонов программы, а затем отбрасываем N/3 максимальных и N/3 минимальных результатов замеров. Для оставшиеся N/3 замеров мы находит среднее арифметическое, которое и берем за основной результат. Величина N варьируется в зависимости от конкретной ситуации, но обычно с лихвой хватает 9-12 прогонов – большее количество уже не увеличивает точности результатов.

Одна из возможных реализаций данного алгоритма приведена ниже:

unsigned int cycle_mid(unsigned int *buff, int nbuff)

{

       int a,xa=0;

       if (!nbuff) nbuff=A_NITER; 

       buff=buff+1;    nbuff--;  // Исключаем первый элемент

       if (getargv("$NoSort",0)==-1)

       qsort(buff,nbuff,sizeof(int), \

                     (int (*)(const void *,const void*))(_compare));

       for (a=nbuff/3;a<(2*nbuff/3);a++)

              xa+=buff[a];

       xa/=(nbuff/3);

       return xa;

}

Листинг 8 Нахождение средне типичного времени выполнения



Содержание раздела