Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/58: Рейтинг темы: голосов - 58, средняя оценка - 4.83
Chelioss
181 / 181 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
#1

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

02.05.2012, 00:05. Просмотров 10544. Ответов 9
Метки нет (Все метки)

функция time не подходит, потому что нужна точность хотя бы до 1 милисекунды.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.05.2012, 00:05
Ответы с готовыми решениями:

Как с точностью до микросекунд замерить время выполнения функции?
Товарищи, подскажите, как с точностью до микросекунд замерить время выполнения...

Unix timestamp замерить время работы программы
Как можно с помощью unix timestamp замерить время работы программы в секундах...

Замерить время?
Подскажите пожалуйста, как замерить время выполненияи нструкции вплоть до...

Замерить время вычислений
Добрый вечер. Есть ли способ замерить продолжительность процесса вычислений,...

Как отменить перерисовку на время работы функции TreeView_DeleteAllItems?
как отправить окну сообщение не перерисовываться?

9
panicwassano
594 / 562 / 104
Регистрация: 07.11.2010
Сообщений: 2,004
02.05.2012, 00:14 #2
http://www.boost.org/doc/libs/1_49_0/libs/timer/doc/cpu_timers.html
как вариант
2
HighPredator
5675 / 1994 / 721
Регистрация: 10.12.2010
Сообщений: 5,741
Записей в блоге: 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
4
Evg
Эксперт CАвтор FAQ
19271 / 7129 / 527
Регистрация: 30.03.2009
Сообщений: 19,962
Записей в блоге: 30
02.05.2012, 00:46 #4
Есть ещё clock, которая есть на многих системах. В отличие от GetTickCount, которая есть только под windows (но скорее всего считает более точно)

Ну и общая рекомендация по замерам. Если нужно измерить время работы функции, то нужно её в цикле исполнять много раз. При таком подходе результаты будут более достоверными
2
Chelioss
181 / 181 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
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;
}
0
Evg
Эксперт CАвтор FAQ
19271 / 7129 / 527
Регистрация: 30.03.2009
Сообщений: 19,962
Записей в блоге: 30
02.05.2012, 01:09 #6
Цитата Сообщение от Chelioss Посмотреть сообщение
Время не слишком большое? Как думаете?
Я не знаю ни того, ни другого алгоритма, а вникать несколько лениво.

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

Меня удивляет то, что есть тяжелые игры типа Battlefield bad comapany 2, которые выполняются в реальном времени и при очень низком отклике, а определитель матрицы 9x9 считается за 12 секунд.
0
Evg
Эксперт CАвтор FAQ
19271 / 7129 / 527
Регистрация: 30.03.2009
Сообщений: 19,962
Записей в блоге: 30
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 - вообще неизвестно, дождёшься ли результата до пенсии
1
Chelioss
181 / 181 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
02.05.2012, 18:20  [ТС] #9
Цитата Сообщение от Evg Посмотреть сообщение
Но соотношение между алгоритмами осталось примерно таким же.
Так и должно быть.
Я так прикинул:
Для метода разложения по первой строке:
n!n-1 - это кол-во операций сложений и произведений.
Для метода конденсации Доджсона:
3 * ( Сумма от i=1 до n-2 ( (n-i)2 ) ) + 8
Цитата Сообщение от Evg Посмотреть сообщение
Ты уверен, что в battlfield'е нужно считать детерминант?
Я не думаю, что там считают определители. Просто там столько всего происходит. И взрывы, и стрельба и т.д. и т.п. - это все в одно время.
0
Evg
Эксперт CАвтор FAQ
19271 / 7129 / 527
Регистрация: 30.03.2009
Сообщений: 19,962
Записей в блоге: 30
02.05.2012, 18:27 #10
Цитата Сообщение от Chelioss Посмотреть сообщение
И взрывы, и стрельба и т.д. и т.п. - это все в одно время
Не поверишь, но это всё занимает меньше времени, чем факториальные счётные алгоритмы. К тому же критические фрагменты на ассемблере пишутся (потому что компилятор далеко не всегда может задействовать все возможности аппаратуры для ускорения рассчётов)
1
02.05.2012, 18:27
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.05.2012, 18:27

Как замерить длительность выполнения кода?
Нужно замерить длительность выполнения кода. Как?

Как сократить время работы программы?!
Нужно сократить время работы программы по вычислению чисел Фибоначчи: Вот мой...

Как уменьшить время работы программы?
#include&lt;iostream&gt; using namespace std; int main() { int a,m,n; ...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru