Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Время выполнения кода. 
:(
    Опции темы
Elfet
Дата 17.4.2006, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

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



Как определить время выполнения кода? 


--------------------
PM MAIL WWW Skype   Вверх
Earnest
Дата 17.4.2006, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



Время померять, до и после... 


--------------------
...
PM   Вверх
Elfet
Дата 17.4.2006, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

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



Понятно smile А как? smile И что бы только моего процеса? smile  smile  smile  smile  


--------------------
PM MAIL WWW Skype   Вверх
SergeCpp
Дата 17.4.2006, 20:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


 
**


Профиль
Группа: Участник
Сообщений: 955
Регистрация: 8.8.2005
Где: At Home

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



The GetProcessTimes function retrieves timing information for the specified process 
PM MAIL WWW ICQ   Вверх
Elfet
Дата 18.4.2006, 09:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

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



И как этим пользоваться? smile Покажите на примере пожалуйста!  smile  


--------------------
PM MAIL WWW Skype   Вверх
SergeCpp
Дата 18.4.2006, 10:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


 
**


Профиль
Группа: Участник
Сообщений: 955
Регистрация: 8.8.2005
Где: At Home

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



Код
HANDLE h( GetCurrentProcess() );

FILETIME Creation;
FILETIME Exit;

FILETIME KernelBeg;
FILETIME UserBeg;

GetProcessTimes( h, &Creation, &Exit, &KernelBeg, &UserBeg );

// работаем...

FILETIME KernelEnd;
FILETIME UserEnd;

GetProcessTimes( h, &Creation, &Exit, &KernelEnd, &UserEnd );

// вычисляем разность...
 
PM MAIL WWW ICQ   Вверх
Elfet
Дата 18.4.2006, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

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



А я вот так попробовал: так можно?  smile 
Код

void main()
{
  SYSTEMTIME stBefore, stAfter;
 
  GetSystemTime(&stBefore);

  f();

  GetSystemTime(&stAfter);

  double secondCount, milliSecCount;

  secondCount =  ( stBefore.wSecond <= stAfter.wSecond ) ? stAfter.wSecond - stBefore.wSecond  :
                                                           60+stAfter.wSecond - stBefore.wSecond;               
  milliSecCount = ( stBefore.wMilliseconds <= stAfter.wMilliseconds ) ? stAfter.wMilliseconds - stBefore.wMilliseconds :
                                                                        1000+stAfter.wMilliseconds - stBefore.wMilliseconds; 
  milliSecCount += secondCount*1000;

  cout << "Working take time in milliseconds: " << milliSecCount/1000 << '\n';
    
}
 


--------------------
PM MAIL WWW Skype   Вверх
SergeCpp
Дата 18.4.2006, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


 
**


Профиль
Группа: Участник
Сообщений: 955
Регистрация: 8.8.2005
Где: At Home

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



Цитата(Elfet @  17.4.2006,  23:15 Найти цитируемый пост)
И что бы только моего процеса?

В Вашем решении считается время всех процессов... 
PM MAIL WWW ICQ   Вверх
Elfet
Дата 18.4.2006, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

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



SergeCpp, а разность чего?  smile  smile  


--------------------
PM MAIL WWW Skype   Вверх
SergeCpp
Дата 18.4.2006, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


 
**


Профиль
Группа: Участник
Сообщений: 955
Регистрация: 8.8.2005
Где: At Home

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



Код
// Kernel = KernelEnd - KernelBeg

__int64 kb( KernelBeg );
__int64 ke( KernelEnd );

__int64 k ( ke - kb );

// User = UserEnd - UserBeg

__int64 ub( UserBeg );
__int64 ue( UserEnd );

__int64 u ( ue - ub );

// Total = Kernel + User

__int64 total( k + u ); // in 100-ns intervals
 

Это сообщение отредактировал(а) SergeCpp - 18.4.2006, 10:38
PM MAIL WWW ICQ   Вверх
FiMa1
Дата 29.10.2007, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(SergeCpp @ 18.4.2006,  10:30)
Код
// Kernel = KernelEnd - KernelBeg

__int64 kb( KernelBeg );
__int64 ke( KernelEnd );

__int64 k ( ke - kb );

// User = UserEnd - UserBeg

__int64 ub( UserBeg );
__int64 ue( UserEnd );

__int64 u ( ue - ub );

// Total = Kernel + User

__int64 total( k + u ); // in 100-ns intervals

Я извиняюсь, я не понял этого. Судя по статье Why can't you treat a FILETIME as an __int64? мы не можем использовать FILETIME как __int64. Я также получил и сообщение об ошибке в среде MS Visual Studio 2005 "cannot convert from 'FILETIME' to '__int64'".
Я пытался использовать static_cast, но также получил сообщение о невозможном преобразовании типов.
Сработало следующее:
Код
...
// вычисляем разность Kernel = KernelEnd - KernelBeg
__int64 kb( *reinterpret_cast<__int64*>(&KernelBeg) );
...

Я не уверен правильно ли будет поступать таким образом...
PM   Вверх
SergeCpp
Дата 29.10.2007, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


 
**


Профиль
Группа: Участник
Сообщений: 955
Регистрация: 8.8.2005
Где: At Home

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



PM MAIL WWW ICQ   Вверх
FiMa1
Дата 29.10.2007, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(SergeCpp @ 29.10.2007,  12:55)
Вот тут вот посмотрите

Ага, я сначала невнимательно прочел. Спасибо.
Почему для приведенного ниже цикла всегда получаю 0?
Код
union F64 {
    FILETIME f;
    F64( FILETIME f ) : f( f ) {}
    __int64 i;
    operator __int64() { return i; }
};

int main()
{
    HANDLE h( GetCurrentProcess() );

    FILETIME Creation;
    FILETIME Exit;

    FILETIME KernelBeg;
    FILETIME UserBeg;

    GetProcessTimes( h, &Creation, &Exit, &KernelBeg, &UserBeg );

    // работаем...
    for(int i = 0; i < 10000; ++i) ;

    FILETIME KernelEnd;
    FILETIME UserEnd;

    GetProcessTimes( h, &Creation, &Exit, &KernelEnd, &UserEnd );

    // вычисляем разность Kernel = KernelEnd - KernelBeg
    F64 kb( KernelBeg );
    F64 ke( KernelEnd );

    __int64 k( ke - kb );

    // User = UserEnd - UserBeg
    F64 ub( UserBeg );
    F64 ue( UserEnd );

    __int64 u ( ue - ub );

    // Total = Kernel + User
    __int64 total( k + u ); // in 100-ns intervals

    std::cout << total;

    return 0;
}


Это сообщение отредактировал(а) FiMa1 - 29.10.2007, 13:27
PM   Вверх
SergeCpp
Дата 29.10.2007, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


 
**


Профиль
Группа: Участник
Сообщений: 955
Регистрация: 8.8.2005
Где: At Home

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



Компилятор оптимизирует этот цикл (тут ничего не делается, он и не делает ничего)

for( int i( 0 ); i < 10000; i++ );

Поставьте

Sleep( 100 );

P.S. Поставьте в настройках генерацию ассемблерного листинга — весьма и весьма полезно

PM MAIL WWW ICQ   Вверх
FiMa1
Дата 29.10.2007, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(SergeCpp @ 29.10.2007,  14:16)
Компилятор оптимизирует этот цикл (тут ничего не делается, он и не делает ничего)
for( int i( 0 ); i < 10000; i++ );
Поставьте
Sleep( 100 );

Нет, я определенно делаю что-то не так... Sleep(100); результат - 0.
Попробовал нагрузить цикл вот так
Код
double d = 0.1;
// работаем...
for( int i( 0 ); i < 10000; i++ ) d += d;

результат - 0
Вот это:
Код
// работаем...
for( int i( 0 ); i < 10000; i++ )
    std::cout << ++i;

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


 




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


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

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