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

 
 
> Как измерять время выполнения алгоритма?, на целевой платформе и PC
beaRTS
сообщение Dec 18 2012, 07:47
Сообщение #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;
}


упс,глюк словился - две ветки сгенерировалось.
Модераторы, удалите, пожалуйста, одну такую же тему...

Мне вот что кажется.
Коль уж пишу под встраиваемое железо, то достоверней всего замерять именно на целевой платформе (железке), на которой нет ни какой Оси. Тупо шьем программу в процессор. Алгоритм обрамляем в начале и в конце командами дрыгания ножек и уже осциллографом измеряем время выполнения. А там уже, если надо, пересчитываем в количество тиков, исходя из частоты процессора...

Сообщение отредактировал beaRTS - Dec 18 2012, 08:02


--------------------
"Об уме человека вернее судить по его вопросам, нежели по его ответам" (с)
Go to the top of the page
 
+Quote Post

Сообщений в этой теме


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

 


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


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