Функции TimeLocal и TimeCurrent ?

 

Как известно данные функции могут возвращать время в секундах. 

А как измерить десятые, или даже сотые доли секунд? 

 
int GetTickCount( )

Функция GetTickCount() возвращает количество миллисекунд, прошедших с момента старта системы. Счетчик ограничен разрешающей способностью системного таймера. Так как время хранится как беззнаковое целое, то он переполняется каждые 49.7 дней.


Совместо с TimeLocal() вполне возможно написать функцию возвращающую местное время с тысячными.

 
Integer писал (а) >>
int GetTickCount()

Функция GetTickCount() возвращает количество миллисекунд, прошедших с момента старта системы. Счетчик ограничен разрешающей способностью системного таймера. Так как время хранится как беззнаковое целое, то он переполняется каждые 49.7 дней.


Совместо с TimeLocal() вполне возможно написать функцию возвращающую местное время с тысячными.

Это очень хорошо, что есть такая функция int GetTickCount( ). Еще бы пример использования...

 
Пример вызова функции? int value=GetTickCount(). А чтобы саму функцию возвращающую такое время грамотно реализовать - надо посидеть, есть много очем подумать и на что внимание обратить.
 
Integer писал (а) >>
Пример вызова функции? int value=GetTickCount(). А чтобы саму функцию возвращающую такое время грамотно реализовать - надо посидеть, есть много очем подумать и на что внимание обратить.

Спасибо. Буду посидеть, и  много очем подумать. Может и получится задуманное.

 
на старте надо подсечь значение GetTickCount() в момент смены секунды, затем отсчитывать тысячные от этого значения. Тут такая мертвая зона получается между значение GetTickCount() на предыдущей секунде и на текущей, если в дальнейшем значение GetTickCount() попадает в эту зону, то невозможно определить к какой секунде относится значение, наверно надо включат ожидание и пропускать такой момент.
 
Или другой вариант. На старте подсечь момент смены секунды и запомнить местное время и GetTickCount(), затем по значению GetTickCount() и запомненного времени расчитывать полное время.
 
double fGetPrecisionTimeLocal(){
   static int TimePrev=-1;
   static int TickPrev=0;
   int TickNow=GetTickCount();      
      if(TimePrev!=-1){
         if(TickNow<TickPrev){ // новая эпока GetTickCount()
            TimePrev=-1; // будем инициализировать заново
         }
      }
      if(TimePrev==-1){ // инициализация
         TimePrev=TimeLocal();
            while(true){
               int TimeNow=TimeLocal();
               TickNow=GetTickCount();
                  if(TimeNow!=TimePrev){
                     TimePrev=TimeNow;
                     TickPrev=TickNow;
                     break;
                  }
               TimePrev=TimeLocal();
               TickPrev=GetTickCount();
            }
      }
   // время
   TickNow=GetTickCount();
   int tmp=TickNow-TickPrev;
   return(TimePrev+0.001*tmp);
}
Только мне не очень нравится переинициализация с началом новой эпохи GetTickCount(). Может кто предложит более изящный метод?
 
Integer писал (а) >>
Только мне не очень нравится переинициализация с началом новой эпохи GetTickCount(). Может кто предложит более изящный метод?

можно предложить лишь для профилирования времени выполнения программы - куска програмы

использовать что то другое

например свою функцию из DLL

 

Еще можно к каким-нибудь часам ядреным законнектится. Я имел ввиду небольшие вычисления, если значение GetTickCount() имеет меньшее значение чем при предыдущем вызове, что означает переход на следующий круг. Это не сложно, надо подумать немного, а не хочется:)

 
Integer писал (а) >>

Еще можно к каким-нибудь часам ядреным законнектится. Я имел ввиду небольшие вычисления, если значение GetTickCount() имеет меньшее значение чем при предыдущем вызове, что означает переход на следующий круг. Это не сложно, надо подумать немного, а не хочется:)


я это понял... потому и предложил внешнюю

у меня есть код на Си++

найду выложу

/*
 
   вычисление времени исполнения процедуры
 
*/
#include "stdafx.h"
 
 
#include <stdlib.h>
  
// --- получение частоты процессора 
#if !defined _TIMER_H_
#define _TIMER_H_ 
inline unsigned __int64 GetCycleCount(void)
 {
   _asm   _emit   0x0F
   _asm   _emit   0x31
} 
 
 
class KTimer
{
 unsigned __int64 m_startcycle;
public:
 unsigned __int64 m_overhead;
 KTimer() {
   m_overhead = 0;
   Start();
   m_overhead = Stop();
 }
 
 void Start(void) {
   m_startcycle = GetCycleCount();
 }
 
 unsigned __int64 Stop(void) {
   return GetCycleCount() - m_startcycle - m_overhead;
 }
};
#endif
//-----------------------------------------------------------------------------------
 
 
 
int main(int argc, char* argv[])
{
    printf("YURAZ This profiler Time !\n");
 
///--- вычислим скорось работы процессора
    KTimer timer;
 
    unsigned cpuspeed10; 
    unsigned __int64 speed;     // правда упираемся в 64 бита
 
    timer.Start();
    _sleep(1000);
    cpuspeed10 = (unsigned)(timer.Stop()/100000); // получим скорость процессора
    printf("\nCPU speed %d.%02d mhz\r\n", cpuspeed10/10, cpuspeed10 % 10); 
///--- 
 
 
    //---
    timer.Start();
    _sleep(100);
    speed =   timer.Stop();
    printf( "\n SpeedTech %d",  speed );
 
 
    timer.Start();
    _sleep(10);
    speed =   timer.Stop();
    printf( "\n SpeedTech %d",  speed );
 
 
    timer.Start();
    _sleep(1);
    speed =   timer.Stop();
    printf( "\n SpeedTech %d",  speed );
 
 
 
    //---
    timer.Start();
    _sleep(1000);
    speed =   (timer.Stop());
    printf( "\n SpeedTech %d",  speed/cpuspeed10   );
 
 
    timer.Start();
    _sleep(100);
    speed =    timer.Stop();
    printf( "\n SpeedTech %d",  speed /cpuspeed10  );
 
 
    timer.Start();
    _sleep(10);
    speed =    timer.Stop();
    printf( "\n SpeedTech %d",  speed /cpuspeed10  );
 
 
 
    ///----
   return 0;
}
Причина обращения: