Форум программистов, компьютерный форум CyberForum.ru

Как замерить время работы функции? - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 65, средняя оценка - 4.92
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
02.05.2012, 00:05     Как замерить время работы функции? #1
функция time не подходит, потому что нужна точность хотя бы до 1 милисекунды.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
panicwassano
591 / 559 / 20
Регистрация: 07.11.2010
Сообщений: 2,004
02.05.2012, 00:14     Как замерить время работы функции? #2
http://www.boost.org/doc/libs/1_49_0...pu_timers.html
как вариант
HighPredator
 Аватар для HighPredator
5351 / 1734 / 320
Регистрация: 10.12.2010
Сообщений: 5,120
Записей в блоге: 3
02.05.2012, 00:19     Как замерить время работы функции? #3
Вариант из обычных:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include<iostream>
#include<windows.h>
 
using namespace std;
 
int main()
{
    int start=GetTickCount();
    for(int i=0;i<1000000;i++)
    {
        for(int j=0;j<1024;j++){}
    }
    int end=GetTickCount();
    cout<<end-start<<endl;
    getchar();
    return 0;
}
http://msdn.microsoft.com/en-us/library/windows/desktop/ms724408(v=vs.85).aspx
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16828 / 5249 / 321
Регистрация: 30.03.2009
Сообщений: 14,136
Записей в блоге: 26
02.05.2012, 00:46     Как замерить время работы функции? #4
Есть ещё clock, которая есть на многих системах. В отличие от GetTickCount, которая есть только под windows (но скорее всего считает более точно)

Ну и общая рекомендация по замерам. Если нужно измерить время работы функции, то нужно её в цикле исполнять много раз. При таком подходе результаты будут более достоверными
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
02.05.2012, 01:03  [ТС]     Как замерить время работы функции? #5
Я тут измерил время нахождения определителя методом конденсации Доджонса(1) и методом разложения по первой строке(2).
Для матрицы 9x9 у меня посчитало первым методом за 3.432 секунды, а вот вторым за 81.526. Процессор amd athlon 64 x2 4600+.
Время не слишком большое? Как думаете? Странно, что первый метод так быстро считает по сравнению со вторым, а второй так долго вообще.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include <vector>
#include <iostream>
#include <windows.h>
 
void erase_irow_jcolomn( std::vector< std::vector< long double >>& matr, int i, int j )
{
    matr.erase( matr.begin() + i );
    for( size_t i = 0; i < matr.size(); ++i ) {
        matr.at( i ).erase( matr.at( i ).begin() + j );
    }
}
 
// метод конденсации Доджсона
long double determinant( std::vector< std::vector< long double >>& matr )
{
    if( matr.size() == 1 ) {
        return matr.at( 0 ).at( 0 );
    }
    if( matr.size() == 2 ) {
        return matr.at( 0 ).at( 0 ) * matr.at( 1 ).at( 1 ) - matr.at( 0 ).at( 1 ) * matr.at( 1 ).at( 0 );
    }
    auto matr1( matr );
    erase_irow_jcolomn( matr1, 0, 0 );
    auto matr2( matr );
    erase_irow_jcolomn( matr2, matr2.size() - 1, matr2.size() - 1 );
    auto matr3( matr );
    erase_irow_jcolomn( matr3, matr3.size() - 1, 0 );
    auto matr4( matr );
    erase_irow_jcolomn( matr4, 0, matr4.size() - 1 );
    auto matr5( matr );
    erase_irow_jcolomn( matr5, 0, 0 );
    erase_irow_jcolomn( matr5, matr5.size() - 1, matr5.size() - 1 );
 
    return ( determinant( matr1 ) * determinant( matr2 ) -
        determinant( matr3 ) * determinant( matr4 ) ) / determinant( matr5 );
}
 
// метод разложения по первой строке
long double determinant2( std::vector< std::vector< long double >>& matr )
{
    if( matr.size() == 1 ) {
        return matr.at( 0 ).at( 0 );
    }
 
    long double result = 0.0l;
    for( size_t i = 0; i < matr.size(); ++i ) {
        if( matr.at( 0 ).at( i ) != 0.0 ) {
            auto mtr = matr;
            erase_irow_jcolomn( mtr, 0, i );
            result += ( ( i % 2 == 0 ) ?  1 : -1 ) *
                matr.at( 0 ).at( i ) * determinant2( mtr );
        }
    }
    return result;
}
int main()
{
    int n = 9;
    std::vector< std::vector< long double >> matr( n,std::vector< long double >( n, 0.0l ) );
    for( size_t i = 0; i < matr.size(); ++i ) {
        for( size_t j = 0; j < matr.size(); ++j ) {
            matr[i][j] = rand();
        }
    }
 
    int start=GetTickCount();
    std::cout << determinant( matr ) << std::endl;
    int end=GetTickCount();
    std::cout << (end-start)/1000.0 << std::endl;
    start=GetTickCount();
    std::cout << determinant2( matr ) << std::endl;
    end=GetTickCount();
    std::cout << (end-start)/1000.0 << std::endl;
    std::cin.get();
    return 0;
}
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16828 / 5249 / 321
Регистрация: 30.03.2009
Сообщений: 14,136
Записей в блоге: 26
02.05.2012, 01:09     Как замерить время работы функции? #6
Цитата Сообщение от Chelioss Посмотреть сообщение
Время не слишком большое? Как думаете?
Я не знаю ни того, ни другого алгоритма, а вникать несколько лениво.

Забыл ещё сказать, что время выполнения нужно измерять в режиме генерации кода с оптимизациями (в IDE эта хрень, как правило, называется Release). Особенно при работе со стандартными контейнерами Си++
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
02.05.2012, 01:11  [ТС]     Как замерить время работы функции? #7
Цитата Сообщение от Evg Посмотреть сообщение
Забыл ещё сказать, что время выполнения нужно измерять в режиме генерации кода с оптимизациями (в IDE эта хрень, как правило, называется Release). Особенно при работе со стандартными контейнерами Си++
Время изменилось до 0.468/12.153.

Меня удивляет то, что есть тяжелые игры типа Battlefield bad comapany 2, которые выполняются в реальном времени и при очень низком отклике, а определитель матрицы 9x9 считается за 12 секунд.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16828 / 5249 / 321
Регистрация: 30.03.2009
Сообщений: 14,136
Записей в блоге: 26
02.05.2012, 09:52     Как замерить время работы функции? #8
Цитата Сообщение от Chelioss Посмотреть сообщение
Время изменилось до 0.468/12.153
Но соотношение между алгоритмами осталось примерно таким же. Я не математик, чтобы оценить сложность вычислений в обоих случаях (а точнее, причину разницы времени более чем в 20 раз). Но хоть вспомнил, что такое детерминант

Цитата Сообщение от Chelioss Посмотреть сообщение
Меня удивляет то, что есть тяжелые игры типа Battlefield bad comapany 2, которые выполняются в реальном времени и при очень низком отклике, а определитель матрицы 9x9 считается за 12 секунд
Ты уверен, что в battlfield'е нужно считать детерминант? Определитель матрицы имеет факториальную сложность вычисления. Т.е. определитель 3х3 у тебя посчитается практически мгновенно, а 9х9 - очень долго. А 20х20 - вообще неизвестно, дождёшься ли результата до пенсии
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
02.05.2012, 18:20  [ТС]     Как замерить время работы функции? #9
Цитата Сообщение от Evg Посмотреть сообщение
Но соотношение между алгоритмами осталось примерно таким же.
Так и должно быть.
Я так прикинул:
Для метода разложения по первой строке:
n!n-1 - это кол-во операций сложений и произведений.
Для метода конденсации Доджсона:
3 * ( Сумма от i=1 до n-2 ( (n-i)2 ) ) + 8
Цитата Сообщение от Evg Посмотреть сообщение
Ты уверен, что в battlfield'е нужно считать детерминант?
Я не думаю, что там считают определители. Просто там столько всего происходит. И взрывы, и стрельба и т.д. и т.п. - это все в одно время.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.05.2012, 18:27     Как замерить время работы функции?
Еще ссылки по теме:

C++ Замерить время вычислений
Как уменьшить время работы программы? C++
Выводить текущее время в определенные позиции консоли во время работы C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16828 / 5249 / 321
Регистрация: 30.03.2009
Сообщений: 14,136
Записей в блоге: 26
02.05.2012, 18:27     Как замерить время работы функции? #10
Цитата Сообщение от Chelioss Посмотреть сообщение
И взрывы, и стрельба и т.д. и т.п. - это все в одно время
Не поверишь, но это всё занимает меньше времени, чем факториальные счётные алгоритмы. К тому же критические фрагменты на ассемблере пишутся (потому что компилятор далеко не всегда может задействовать все возможности аппаратуры для ускорения рассчётов)
Yandex
Объявления
02.05.2012, 18:27     Как замерить время работы функции?
Ответ Создать тему
Опции темы

Текущее время: 05:33. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru