Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как узнать время выполнения кода? код очень быстро выполняется.. 
:(
    Опции темы
Proger10
Дата 20.6.2009, 01:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 16.12.2008

Репутация: нет
Всего: нет



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

Вот один из вариантов взятый с форума:
Код
        long t1=clock();

        cout << t1 << endl;

        int a=0;
        for(int i=0;i<100000;i++)
                a+=i;

        long t2=clock();

        cout << t2 << endl;
        cout << t2-t1 << endl;

Он выдаёт нули - покуда код выполняется быстрее, чем интервал клока smile

Как бы замерять скорость работы именно такого кода? (в миллисекундах)

Компиляторы, под которыми будет работать решение: GCC (Win + Lin).
PM MAIL   Вверх
knut
Дата 20.6.2009, 01:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 588
Регистрация: 7.2.2006

Репутация: нет
Всего: нет



может так
Код

int time = GetTickCount();
RunMyFunc();
ShowMessage(GetTickCount()-time);


или так
Код

clock_t a, b;
a = clock();
f();
b = clock();
ShowMessage((b-a)/CLOCKS_PER_SEC);




--------------------
Цитата

Многие вещи нам непонятны не оттого, что наши понятия слабы, а оттого, что данные вещи не входят в круг наших понятий.
PM MAIL   Вверх
Proger10
Дата 20.6.2009, 02:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 16.12.2008

Репутация: нет
Всего: нет



Последний работает также - видимо он целые секунды измеряет.

А первый.. где находится функция GetTickCount? smile
PM MAIL   Вверх
knut
Дата 20.6.2009, 02:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 588
Регистрация: 7.2.2006

Репутация: нет
Всего: нет



здесь

Добавлено через 10 секунд
smile


--------------------
Цитата

Многие вещи нам непонятны не оттого, что наши понятия слабы, а оттого, что данные вещи не входят в круг наших понятий.
PM MAIL   Вверх
Proger10
Дата 20.6.2009, 02:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 16.12.2008

Репутация: нет
Всего: нет



 smile 

Вообще, что-то определённо есть интересного в функции clock():
Код
03:04:37 progs $ g++ exec-time2.cpp && ./a.out
start: 0
end: 860000
diff: 860000

03:04:44 progs $ time ./a.out
start: 0
end: 870000
diff: 870000

real    0m0.884s
user    0m0.879s
sys     0m0.002s


Код проги:
Код

#include <iostream>
#include <time.h>

using namespace std;

int main() {

        clock_t t1, t2;

        t1 = clock();

        cout << "start: " << t1 << endl;

        int a=0;
        for( double i=0;i<1000000; i+=0.01 )
                a+=i;

        t2 = clock();

        cout << "end: " << t2 << endl;
        cout << "diff: " << t2-t1 << endl;

        return 0;
}

Если полученное число поделить на 100, то получаем примерное количество милисекунд.. Т.е. у меня в примере сработал интервал меньше одной секунды..
PM MAIL   Вверх
knut
Дата 20.6.2009, 02:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 588
Регистрация: 7.2.2006

Репутация: нет
Всего: нет



вот еще вариант 
Код

LARGE_INTEGER freq;
    QueryPerformanceFrequency(&freq);

    LARGE_INTEGER time1;
    QueryPerformanceCounter(&time1);

    DoSomething();

    LARGE_INTEGER time2;
    QueryPerformanceCounter(&time2);
    time2.QuadPart -= time1.QuadPart;
    double span = (double) time2.QuadPart / freq.QuadPart;

 и все они возвращают  в миллисекундах


--------------------
Цитата

Многие вещи нам непонятны не оттого, что наши понятия слабы, а оттого, что данные вещи не входят в круг наших понятий.
PM MAIL   Вверх
Proger10
Дата 20.6.2009, 03:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 16.12.2008

Репутация: нет
Всего: нет



В линуксе у меня компилятор ругается на:
Код
exec-time3.cpp:8: error: 'LARGE_INTEGER' was not declared in this scope

using namespace чего-то прописать? smile Только чего..? У меня пока что только using namespace std; там..
PM MAIL   Вверх
andrew_121
Дата 20.6.2009, 03:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 10
Всего: 33



knut, Не совсем так. На сколько я помню, они манипулируют наносекундами. Но что-то в них меняется от компа к компу. Могу ошибаться.
http://msdn.microsoft.com/en-us/library/ms979201.aspx
Вот из результатов одного из тестов:
Код

int to int (no boxing): 1.22920650529606 nanoseconds
int to object (boxing): 77.132708207328 nanoseconds
object to int (unboxing): 2.87746068285215 nanoseconds 





--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
Proger10
Дата 20.6.2009, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 16.12.2008

Репутация: нет
Всего: нет



Так а можно примерчик небольшой с использованием этого QueryPerformanceFrequency? (с подключением нужных файлов) Покуда в линуксе так и не получилось скомпиллить..
PM MAIL   Вверх
andrew_121
Дата 20.6.2009, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 10
Всего: 33



Proger10, Это WINAPI функции. В Линукс, их быть не может. Разве что из Wine выдрать. Но смысл.
Пиши в Линукс раздел: http://forum.vingrad.ru/forum/c-c++program...Unix-Linux.html


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
Proger10
Дата 20.6.2009, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 16.12.2008

Репутация: нет
Всего: нет



А.. ну раз винапи, то мне конечно это не подходит.. я вначале говорил про небольшую кроссплатформенность решения.. (хотя бы вин и лин).
PM MAIL   Вверх
andrew_121
Дата 20.6.2009, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 10
Всего: 33



Proger10, Под виндавз используй эти, а под Линукс другие.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
MAKCim
Дата 20.6.2009, 18:09 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 2
Всего: 207



Цитата(andrew_121 @  20.6.2009,  03:05 Найти цитируемый пост)
На сколько я помню, они манипулируют наносекундами

насколько я помню, они возвращают значение счетчика TSC


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
lea
Дата 24.11.2010, 05:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 24.11.2010

Репутация: нет
Всего: нет



Подскажите, пожалуйста.
1. Каких файлов не хватает или что не так?

Код
int time = GetTickCount();
RunMyFunc();
ShowMessage(GetTickCount()-time);



или 
Код

clock_t a, b;
a = clock();
f();
b = clock();
ShowMessage((b-a)/CLOCKS_PER_SEC);



Ошибка: ShowMessage: идентификатор не найден

Добавление 
#include <iostream>
#include <time.h>
#include <windows.h>
using namespace std;

не решает проблему.

2. В таком случае:
Код

LARGE_INTEGER freq;
    QueryPerformanceFrequency(&freq);

    LARGE_INTEGER time1;
    QueryPerformanceCounter(&time1);

    DoSomething();

    LARGE_INTEGER time2;
    QueryPerformanceCounter(&time2);
    time2.QuadPart -= time1.QuadPart;
    double span = (double) time2.QuadPart / freq.QuadPart;


Ошибок компиляции нет, но функция, время выполнения которой узнавалось, выдает свои данные. Результата времени нет. 

Visual Studio.


Это сообщение отредактировал(а) lea - 24.11.2010, 05:44
PM MAIL   Вверх
lea
Дата 24.11.2010, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 24.11.2010

Репутация: нет
Всего: нет



Цитата(lea @ 24.11.2010,  05:27)
Подскажите, пожалуйста.
1. Каких файлов не хватает или что не так?

Код
int time = GetTickCount();
RunMyFunc();
ShowMessage(GetTickCount()-time);



или 
Код

clock_t a, b;
a = clock();
f();
b = clock();
ShowMessage((b-a)/CLOCKS_PER_SEC);



Ошибка: ShowMessage: идентификатор не найден

Добавление 
#include <iostream>
#include <time.h>
#include <windows.h>
using namespace std;

не решает проблему.

2. В таком случае:
Код

LARGE_INTEGER freq;
    QueryPerformanceFrequency(&freq);

    LARGE_INTEGER time1;
    QueryPerformanceCounter(&time1);

    DoSomething();

    LARGE_INTEGER time2;
    QueryPerformanceCounter(&time2);
    time2.QuadPart -= time1.QuadPart;
    double span = (double) time2.QuadPart / freq.QuadPart;


Ошибок компиляции нет, но функция, время выполнения которой узнавалось, выдает свои данные. Результата времени нет. 

Visual Studio.

Проблема решена.

Таким способом:

Код

int t1=GetTickCount();
my_func ();
int t2=GetTickCount();
cout<<(t2-t1)/1000.;



всё компилируется без ошибок и считает.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0555 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.