Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Программирование [игнор отключен] [закрыт для гостей] / точность отсчета времени + / 13 сообщений из 13, страница 1 из 1
12.11.2013, 18:44
    #38462522
tchingiz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
точность отсчета времени +


Код: plaintext
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.
#include <iostream>
//
#include "h.h"
#include <ctype.h>
#include <ctime>
#include <Windows.h>
using namespace std;
	int n;
	int S;
void main (int argc, char*argv[]) 
{ 
  int n=0;
  int S=0;

  for(int i=1;i<argc;i++){
    if(cmp(argv[i],"-s")==0){ 
      if (argv[i+1]!=0)
         S = atoi(argv[i+1]);
      else 
        cout<<"ERrOR: Vi ne vvils znacheniya S"<<endl;
    }
    if(cmp(argv[i],"-n")==0) {    
      if(argv[i+1]!=0)
          n = atoi(argv[i+1]);
      else 
        cout<<"EROR: Vi ne vvils znacheniya N"<<endl;
		  
    }
  }
  clock_t start = clock();

  for (n;n>0;n--) Sleep(S); 

  clock_t end = clock();
  cout<< "\nTime = " << (double)(end-start)/CLOCKS_PER_SEC;
}







for (n;n>0;n--) Sleep(S); <---- n раз повторяю задержку на S милисекунд.
то есть

n= 1000 при S=1 должен был бы выдавать 1 сек общего времени,
если бы таймер в компе имел отсчет времени меньше чем одна тысячная.
Поскольку таймер в персоналках все наблюдаемое время (с 1990 года) имел точность 1/18.2
то результат работы этой программы был приблизительно такой
...
Рейтинг: 0 / 0
12.11.2013, 18:47
    #38462527
tchingiz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
точность отсчета времени +
потом заметили, что на семерках с 64битным процессором работает правильно,
и, только что обнаружил, что на xp с двумя ядрами тоже работает относительно правильно
...
Рейтинг: 0 / 0
12.11.2013, 18:50
    #38462534
tchingiz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
точность отсчета времени +
хочется увидеть формальное обьяснение и/или
ссылку на доку.
Ссылку на доку почему 1000 задержек по одной тысячной дает 15 сек не надо, это я читал в 199? году. Надо почему сейчас стало правильно
...
Рейтинг: 0 / 0
12.11.2013, 19:03
    #38462547
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
точность отсчета времени +
tchingizПоскольку таймер в персоналках все наблюдаемое время (с 1990 года) имел точность 1/18.2Это было во времена DOS-а.

Ссылка на тему- http://habrahabr.ru/company/intel/blog/186998/
...
Рейтинг: 0 / 0
12.11.2013, 19:09
    #38462553
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
точность отсчета времени +
tchingizточность 1/18.2И, кстати, это не точность, а дискретность (шаг дискретизации).
...
Рейтинг: 0 / 0
12.11.2013, 19:42
    #38462587
tchingiz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
точность отсчета времени +
miksofttchingizточность 1/18.2И, кстати, это не точность, а дискретность (шаг дискретизации).
дадада
...
Рейтинг: 0 / 0
12.11.2013, 19:44
    #38462589
tchingiz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
точность отсчета времени +
miksofttchingizПоскольку таймер в персоналках все наблюдаемое время (с 1990 года) имел точность 1/18.2Это было во времена DOS-а.

Ссылка на тему- http://habrahabr.ru/company/intel/blog/186998/
да
>Период таймера Windows по умолчанию составляет 15.6 мс – он тикает 64 ра
все хотел разделить 1 секунду 15 мс да ленился.
будет 64 а не 18.2
)))
...
Рейтинг: 0 / 0
13.11.2013, 03:35
    #38462905
kolobok0
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
точность отсчета времени +
miksofttchingizточность 1/18.2И, кстати, это не точность, а дискретность (шаг дискретизации).

С такой частотой тикал один из каналов 8253 - PIT в стандартных писюках.
Но ничего не мешало "поддать жару" и ему. Так повесив на обработчик таймера функцию перебора пароля - вскрывали в лоб за несколько дней, на нескольки десяткофф машин :)

давно было дело правда...
(круглый)
...
Рейтинг: 0 / 0
13.11.2013, 09:02
    #38462972
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
точность отсчета времени +
kolobok0С такой частотой тикал один из каналов 8253 - PIT в стандартных писюках.
Но ничего не мешало "поддать жару" и ему.Системные часы начинали убегать, что сильно удивляло пользоваталей
...
Рейтинг: 0 / 0
18.11.2013, 16:56
    #38468862
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
точность отсчета времени +
miksoftСистемные часы начинали убегать, что сильно удивляло пользоваталей Это у криворуких.
Остальные отдавали системе не каждое прерывание.
...
Рейтинг: 0 / 0
18.11.2013, 17:16
    #38468905
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
точность отсчета времени +
Basil A. SidorovmiksoftСистемные часы начинали убегать, что сильно удивляло пользоваталей Это у криворуких.
Остальные отдавали системе не каждое прерывание.Это когда задачей не является удивить пользователей :)
...
Рейтинг: 0 / 0
19.11.2013, 01:32
    #38469286
tchingiz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
точность отсчета времени +
#pragma comment(lib,"winmm")
прикольная прагма для подключения библиотеки - раньше не знал



Код: plaintext
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.
77.
78.
79.
80.
81.
//  
#pragma comment(lib,"winmm")
#include <iostream>
//
#include <string.h>
#include <ctype.h>
#include <ctime>
//
#include <Windows.h>

//#include <dos.h>
using namespace std;


void main (int argc, char*argv[]) 
{ 
  int n=1000;
  int S=1;
  int d=0; 
  int dbgFlg = 0;

  for(int i=1;i<argc;i++){
    if(stricmp(argv[i],"-s")==0){ 
      if (argv[i+1]!=0)
         S = atoi(argv[i+1]);
      else 
        cout<<"ERROR:   sleep interval is missed"<<endl;
    }
    if(stricmp(argv[i],"-d")==0){ 
      dbgFlg = 1;
    }
    else if(stricmp(argv[i],"-n")==0) {    
      if(argv[i+1]!=0)
          n = atoi(argv[i+1]);
      else 
        cout<<"ERROR:  number of repetitions is missed"<<endl;
    }
    else if(stricmp(argv[i],"-r")==0) {    
      if(argv[i+1]!=0)
          d = atoi(argv[i+1]);
      else 
        cout<<"ERROR:  sampling rate is missed"<<endl;
    }             
    else if(strcmp(argv[i],"-?")==0)
      goto usage;
  }

  if (dbgFlg) 
    fprintf (stderr,"\n s/n/r:%d/%d/%d ", S, n, d);
  int rc =0;
  if (d!=0) {
    rc = timeBeginPeriod(d);
    if (dbgFlg)
      cerr<< "timeBeginPeriod(d)="<<rc;
  }

  time_t start = time(0);

//  for (n;n>0;n--) _sleep(S); 
  for (n;n>0;n--) { 
    Sleep(S); 
    if (dbgFlg && n%100 ==0 )
      cerr<< "\n"<<n;
  }

  time_t end = time(0);

  if (d!=0) {
    rc = timeEndPeriod(d);
    if (dbgFlg)
      cerr<< "timeEndPeriod(d)="<<rc;
  }
  cout<< "\nTime = " << (end-start);
  exit(0);
  usage:
  cout<< "\napp.exe [-s sss] [-n nnn] [-r ddd] [-d] : to repeat nnn times Sleep(sss) function" ;
  cout<< "\nsss : interval of sleeping. Default: "<<S ;
  cout<< "\nnnn : number of repetitions. Default: "<<n ;
  cout<< "\nddd : sampling rate. Default dont use  timeBeginPeriod(ddd)";
  exit(1);
}



и сишарповская версия с вызовом сишных программ из winmm.dll



Код: 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.
class MMTimersTest
{
    [DllImport("winmm.dll")]
    private static extern uint timeBeginPeriod(uint period);
    [DllImport("winmm.dll")]
    private static extern uint timeEndPeriod(uint period);
  
 
    static void Main(string []agrs)
    {
        if (agrs.Length < 1)
          { Console.WriteLine("usage: \n timer XXXX\n where XXXX msecs - period of sleeping"); }
        else if (agrs[0] == "-?")
          { Console.WriteLine("usage: \n timer XXXX\n where XXXX msecs - period of sleeping"); }
        else
        {
            Console.WriteLine(" 1 Timer frequency in ticks per second = {0}", 
               Stopwatch.Frequency);
            int l = Int32.Parse(agrs[0]);
            Stopwatch stopWatch = new Stopwatch();
            uint period = 1;
            Console.WriteLine("Non-Standart tick {0} msecs", period);

            
            
            uint rc = timeBeginPeriod(period);
            Console.WriteLine(" now interval =   {0}secs, rc = {1}", period/1000.0, rc );

            stopWatch.Start();
            for (int i = 1; i <= 1000; i++)
            {
                Thread.Sleep(l);
            }
            stopWatch.Stop();

            rc = timeEndPeriod(period);
            Console.WriteLine(" timeEndPeriod, rc = {0}", rc);

            TimeSpan ts = stopWatch.Elapsed;

            // Format and display the TimeSpan value.
            string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
                ts.Hours, ts.Minutes, ts.Seconds,
                ts.Milliseconds / 10);

            Console.WriteLine("RunTime " + elapsedTime);
            Console.WriteLine("Standart tick");
            Stopwatch stopWatch1 = new Stopwatch();
            stopWatch1.Start();
            for (int i = 1; i <= 1000; i++)
            {
                Thread.Sleep(l);
            }
            stopWatch1.Stop();

             ts = stopWatch1.Elapsed;

            elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
                ts.Hours, ts.Minutes, ts.Seconds,
                ts.Milliseconds / 10);
            Console.WriteLine("RunTime " + elapsedTime);
        
        
        
        }
    }


...
Рейтинг: 0 / 0
19.11.2013, 01:43
    #38469291
kolobok0
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
точность отсчета времени +
tchingiz,

OFF/2(что то напомнилось):
когда-то, показывая маленькую свою тулзу(перегрузка компа через заданное кол-во минут-секунд, ДОС) одному человеку он вдруг спросил "А можешь чтоб в памяти ничего не оставалось?" Тогда с ходу ответил "нет". Но спустя некоторое время эта тулза перегружала писюк, ничего не оставляла в памяти при этом(от момента задания, до момента перегрузки).

(круглый)
...
Рейтинг: 0 / 0
Форумы / Программирование [игнор отключен] [закрыт для гостей] / точность отсчета времени + / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]