реклама на сайте
подробности

 
 
> Как измерять время выполнения алгоритма?, на целевой платформе и PC
beaRTS
сообщение Dec 18 2012, 07:35
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 211
Регистрация: 27-12-11
Из: Челябинск
Пользователь №: 69 111



Алгоритм может отлаживаться как на компе, так и на целевой платформе.
Вопрос: как в обоих случаях вы измеряете время выполнения ? подсчитываете количество тактов, затрачиваемых функцией/алгоритмом ? и однозначные ли результаты получаете?

Покапавшись в интернете:
Из­ме­ре­ние ин­тер­ва­лов вре­ме­ни в Windows
Максимально точное измерение кода Хабр
Оптимизация длинной арифметики на C++
Как можно подсчитать время работы алгоритма (части программы) __ простенько
C/C++. Измерение времени работы кода с точностью до такта.
измеряем время выполнения понял что для Большого Брата сложно измерить однозначно и точно количество тактов (время) выполнения. Так как каждый раз при новом запуске будем получать разное время выполнения из-за многозадачности Оси и многоядерности процессоров.

У меня разница получалась примерно в 2-3 раза. максимум около 1000 тиков, минимум около 400 ( ниже программа для оценки извлечения корня ) Причем я не уверен, что 400 - это минимум времени исполнения алгоритма .
Приведу простенькую прогу. Запускал в Визуал Студии.
Код
#include <iostream>
#include <ctime>
#include <intrin.h> // для  __rdtsc()

#pragma intrinsic(__rdtsc)

int isqrt (unsigned x);

int main() {

    double time;
    int result;
    //константа для задания верхнего предела для цикла for
    const int max = 1000000;
    const clock_t start = clock();

    for(int i = 0; i < max; ++i)
        result = isqrt( 10);
    
    time = static_cast< double >( clock() - start ) / CLOCKS_PER_SEC;

    std::cout<< "sqrt result:  " << result  << "  avarage time is " << time << std::endl;
    std::cout << "CLOCKS_PER_SEC: " << CLOCKS_PER_SEC << std::endl;
    std::cout << " time for one isqrt(): " << time / max <<std::endl;
    
    unsigned __int64 startTick, stopTick, ticks;

    startTick = __rdtsc();
    result = isqrt( 10);
    stopTick = __rdtsc();

    ticks = stopTick - startTick;
    std::cout << " time in Ticks for one isqrt(): " << ticks << std::endl;

    std::cin.get();
    return 0;
}

int isqrt (unsigned x)
{
unsigned m, y, b;
m = 0x40000000;
y = 0;
while (m != 0) { //16 раз
b = y | m;
y = y >> 1;
if (x >= b) {
x = x - b;
y = y | m;
}
m = m >> 2;
}
return y;
}


--------------------
"Об уме человека вернее судить по его вопросам, нежели по его ответам" (с)
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
neiver
сообщение Dec 18 2012, 10:01
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 214
Регистрация: 22-03-10
Из: Саратов
Пользователь №: 56 123



Для ПК есть такие инструменты - профайлеры называются. В той-же VisualStudio есть встроенный. Из меню "Analyze" вызывается. Есть еще куча других. Так вот они подробный отчёт предоставляют, какая функция сколько раз вызвана, и сколько времени выполнялась.
В МК можно сделать тест производительности и просто померить время выполнения какой-то функции таймером. А можно пойти дальше и воспользоваться возможностями профилировки кода, предостовляемыми компилятором.
Вот тут немного об этом написано
Смысл в том, что в начало и в конец каждой функции компилятор вставляет вызов функций __cyg_profile_func_enter и __cyg_profile_func_exit соответственно. В них передается арес текущей функции и адрес вызывающей. Есть таймер, который служит источником временнЫх меток. Адреса вызванной, вызывающей функций и временную метку от таймера можно передать на ПК, например, через USART, где потом анализировать.
Конечно такое профилирование искажает время работы программы в целом, но общую картину показывает.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Dec 19 2012, 02:25
Сообщение #3


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(neiver @ Dec 18 2012, 13:01) *
В МК можно сделать тест производительности и просто померить время выполнения какой-то функции таймером. А можно пойти дальше и воспользоваться возможностями профилировки кода, предостовляемыми компилятором.

Времена будут максимальными, без учета сокращений при ветвлениях, зависящих от данных.Это лучше, чем ничего, но практически ничего.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- beaRTS   Как измерять время выполнения алгоритма?   Dec 18 2012, 07:35
- - eugen_pcad_ru   Сам не меряю. ИМХО в такой постановке задачи можно...   Dec 18 2012, 08:26
|- - beaRTS   Цитата(eugen_pcad_ru @ Dec 18 2012, 12:26...   Dec 18 2012, 08:41
|- - beaRTS   Цитата(eugen_pcad_ru @ Dec 18 2012, 11:26...   Dec 20 2012, 07:12
- - Serg76   Для софтового решения вообще не вижу проблем, есть...   Dec 18 2012, 09:09
|- - beaRTS   Цитата(Serg76 @ Dec 18 2012, 13:09) Для с...   Dec 18 2012, 09:15
|- - Serg76   Цитата(beaRTS @ Dec 18 2012, 12:15) Прост...   Dec 18 2012, 09:29
|- - beaRTS   Цитата(Serg76 @ Dec 18 2012, 13:29) Кроме...   Dec 18 2012, 09:33
|- - beaRTS   Цитата(neiver @ Dec 18 2012, 14:01) Для П...   Dec 18 2012, 10:16
|- - beaRTS   Цитата(neiver @ Dec 18 2012, 13:01) Для П...   Dec 19 2012, 05:11
- - SyncLair   Основной способ -- использовать аппаратный счётчик...   Dec 18 2012, 23:45
- - TSerg   Общее правило таково - длительность измерения д.б....   Dec 19 2012, 05:49
|- - beaRTS   Цитата(TSerg @ Dec 19 2012, 08:49) Также,...   Dec 19 2012, 06:24
- - beaRTS   А кто знает сие чудо AMD CodeAnalyst для windows б...   Dec 19 2012, 08:21
- - TSerg   > прогон с минимальным временем исполнения и пр...   Dec 20 2012, 07:32
|- - beaRTS   Цитата(TSerg @ Dec 20 2012, 10:32) Это не...   Dec 20 2012, 07:39
- - TSerg   Кроме того, при тестировании вычислительных процед...   Dec 20 2012, 07:46
- - beaRTS   Ндаа. =) как это все неоднозначно. Спасибо! п...   Dec 20 2012, 07:55
- - TSerg   Пример трассировки на РС одной вычислительной функ...   Dec 20 2012, 08:44
- - beaRTS   Цитата(TSerg @ Dec 20 2012, 12:44) Пример...   Dec 20 2012, 09:28


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th June 2025 - 16:03
Рейтинг@Mail.ru


Страница сгенерированна за 0.01377 секунд с 7
ELECTRONIX ©2004-2016