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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> gettimeofday, под виндой 
V
    Опции темы
Luyan
Дата 23.12.2009, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Под линуксом написал проект используя gettimeofday для определения времени в микросекундах. Теперь стоит задача запустить проект под виндой, а точнее в msvs 2008.
Значения в линуксе высчитывал следующим образом:
Код

typedef struct timeval tm;
tm start, end;
int  timer = 0;
//..
gettimeofday ( &start, NULL );
// операции
gettimeofday ( &end, NULL );
timer = ( end.tv_usec - start.tv_usec ); // получалось время в микросекундах

я понимаю, прямого аналога gettimeofday нет, но в сети нашел интерпретацию под винду -> клик
Дело в том, что мне нужны довольно точные значения, примерно до 50 микросекунд, но под виндой эта функция отказывается работать и выдаёт один и тот же результат: 15625, несмотря на
Цитата

The gettimeofday() function obtain the current time, expressed as seconds and microseconds since the Epoch, and stores it in the timeval structure given in the parameters.

считать по другому не могу, так как очень много раз в проекте использовал gettimeofday. Как выйти из этой ситуации?
вот как пытаюсь запустить под виндой:
Код

#include <iostream>
#include <ctime>
#include <windows.h>
//using namespace System;
using namespace std;

#if defined(_MSC_VER) || defined(_MSC_EXTENSIONS)
  #define DELTA_EPOCH_IN_MICROSECS  11644473600000000Ui64
#else
  #define DELTA_EPOCH_IN_MICROSECS  11644473600000000ULL
#endif
 
struct timezone
{
  int  tz_minuteswest; /* minutes W of Greenwich */
  int  tz_dsttime;     /* type of dst correction */
};
 
// Definition of a gettimeofday function
 
int gettimeofday(struct timeval *tv, struct timezone *tz)
{
// Define a structure to receive the current Windows filetime
  FILETIME ft;
 
// Initialize the present time to 0 and the timezone to UTC
  unsigned __int64 tmpres = 0;
  static int tzflag = 0;
 
  if (NULL != tv)
  {
    GetSystemTimeAsFileTime(&ft);
 
// The GetSystemTimeAsFileTime returns the number of 100 nanosecond 
// intervals since Jan 1, 1601 in a structure. Copy the high bits to 
// the 64 bit tmpres, shift it left by 32 then or in the low 32 bits.
    tmpres |= ft.dwHighDateTime;
    tmpres <<= 32;
    tmpres |= ft.dwLowDateTime;
 
// Convert to microseconds by dividing by 10
    tmpres /= 10;
 
// The Unix epoch starts on Jan 1 1970.  Need to subtract the difference 
// in seconds from Jan 1 1601.
    tmpres -= DELTA_EPOCH_IN_MICROSECS;
 
// Finally change microseconds to seconds and place in the seconds value. 
// The modulus picks up the microseconds.
    tv->tv_sec = (long)(tmpres / 1000000UL);
    tv->tv_usec = (long)(tmpres % 1000000UL);
  }
 
  if (NULL != tz)
  {
    if (!tzflag)
    {
      _tzset();
      tzflag++;
    }
  
// Adjust for the timezone west of Greenwich
      tz->tz_minuteswest = _timezone / 60;
    tz->tz_dsttime = _daylight;
  }
 
  return 0;
}
//..
int main()
{

    /**************************/    
    typedef struct timeval tm;
    tm start, end;
    int  timer = 0;
    /**************************/        

    
    gettimeofday ( &start, NULL );
    //..
    gettimeofday ( &end, NULL );
    
    timer = ( end.tv_usec - start.tv_usec );

    cout << "Number 1:  " << timer << endl;

    return 0;
}


и что означает:
Код

using namespace System;

?
просто компилятор ругается - error C2871: 'System' : a namespace with this name does not exist
может поэтому не работает?
PM   Вверх
xvr
Дата 23.12.2009, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



GetSystemTime возвращает время с гранулярностью системного таймера (т.е. около 20ms). Ни о каких микросекундах там разговора нет  smile 
Для получения отметки времени с высокой точностью служит функций QueryPerformanceCounter, но она возвращает время относительно неизвестно чего (скорее всего относительно старта виндов)
Так что сделать полный аналог gettimeofday с точностью до микросекунд не получится. Но сделать аналог с точностью до end.tv_usec - start.tv_usec вполне можно


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


Бывалый
*


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

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



Цитата(xvr @  23.12.2009,  19:00 Найти цитируемый пост)
GetSystemTime возвращает время с гранулярностью системного таймера (т.е. около 20ms). Ни о каких микросекундах там разговора нет

Цитата(xvr @  23.12.2009,  19:00 Найти цитируемый пост)
Но сделать аналог с точностью до end.tv_usec - start.tv_usec вполне можно

 smile usec - это же микросекунды -> msdn
так можно или нельзя?
PM   Вверх
xvr
Дата 23.12.2009, 19:27 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата

usec - это же микросекунды
Ну и что?
Цитата

так можно или нельзя? 

Смотря что -
  •  Из GetSystemTime получить РЕАЛЬНЫЕ микросекунды - нельзя. (То, что время возвращается в 100 ns еще не значит, что все его биты значащие. В реалии там возвращается время в тика системного таймера умноженное на некоторую большую константу)
  •  С помощью QueryPerformanceCounter посчитать микросекунды - можно 
  •  Сделать реализацию gettimeofday с точностью возвращаемого времени до микросекунды - нельзя. (Точнее можно, но с ОЧЕНЬ большими трудностями)

PM MAIL   Вверх
Luyan
Дата 23.12.2009, 19:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



то есть у меня всего один путь - чтобы получать значения в микросекундах надо переделывать все под QueryPerformanceCounter?
PM   Вверх
xvr
Дата 23.12.2009, 20:41 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(Luyan @ 23.12.2009,  19:36)
то есть у меня всего один путь - чтобы получать значения в микросекундах надо переделывать все под QueryPerformanceCounter?

Если у вас gettimeofday ВЕЗДЕ применяется только, что бы посчитать end.tv_usec - start.tv_usec, то можно из QueryPerformanceCounter сделать суррогат gettimeofday, который будет корректно работать В ЭТИХ УСЛОВИЯХ (и с точностью до мкс).
Если же gettimeofday применяется и по прямому назначению, то увы, придется что то переписывать.

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


Бывалый
*


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

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



Цитата(xvr @  23.12.2009,  20:41 Найти цитируемый пост)
Если же gettimeofday применяется и по прямому назначению, то увы, придется что то переписывать.

я везде использовал только для вычисления времени, так что буду писать свой gettimeofday с использованием  QueryPerformanceCounter. xvr, можете подкинуть идеи по организации функции?

PM   Вверх
xvr
Дата 23.12.2009, 22:00 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Ну как то так
Код

int gettimeofday(struct timeval *tv, struct timezone *tz)
{
 static unsigned __int64 fr=0;
 unsigned __int64 v;

 if (!fr) 
  {
    QueryPerformanceFrequency((LARGE_INTEGER*)&fr);
    fr/=1000000000;
  }
 QueryPerformanceCounter((LARGE_INTEGER*)&v);
 tv->tv_sec=time(NULL); // Это не обязательно, можно просто затереть нулем: tv->tv_sec=0;
 tv->tv_usec = v/fr;
 return 0; 
}



Это сообщение отредактировал(а) xvr - 23.12.2009, 22:01
PM MAIL   Вверх
Luyan
Дата 23.12.2009, 22:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(xvr @  23.12.2009,  22:00 Найти цитируемый пост)

fr/=1000000000;

3 нуля лишние.

Ура! всё прекрасно работает! smile xvr, спасибо большое! вы помогли мне сэкономить кучу времени!

Добавлено @ 22:14
не могу: 
Цитата
У Вас недостаточно постов, чтобы изменять репутацию пользователей.
 Прошу, кто-нибудь, плюсаните xvr.

Это сообщение отредактировал(а) Luyan - 23.12.2009, 22:15
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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