Автор Тема: [Все] Определение тактов процессора между двумя событиями.  (Прочитано 27041 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн C2H5OH [?]

  • Знаю я тут одно место с офигенными циркулями...
  • AutoIt Гуру
  • *****
  • Сообщений: 1473
  • Репутация: 332
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
Бухгалтер Вася озабочен вопросом быстродействия своих скриптов. Вася решил заняться проблемой всерьёз и разработать метод измерения времени выполнения различных участков скрипта. Поскольку Вася - бухгалтер, а у бухгалтера должно быть всё точно, то Вася хочет измерять время в тактах процессора, то есть Вася хочет точно посчитать сколько тактов процессора прошло между началом измерений и концом измерений.
Васин старый корешь работает системным программистом. Во время последней пьянки Вася поделился с ним своими мыслями и тот расказал Васе умную вещь.
Цитировать
На системной плате находится микросхема системного таймера. У этой микросхемы есть три 16-битных счётчика, один из режимов работы которых следующий.
В счётчики загружаются некоторые числа N1, N2 и N3.
За каждый такт процессора значение счётчиков уменьшается на 1.
По достижении нуля каждый счётчик проводит автозагрузку начального значения Nx.
...
В какой-то момент времени можно прочитать текущие значения всех счётчиков.
За две бутылки пива Васин корешь даже написал dll-ку и соответственно библиотеку AutuIt с двумя функциями
Код: AutoIt [Выделить]
SystemTimersInit(N1,N2,N3)
; загружает в счётчики таймеров значения
; N1 - значение для автозагрузки первого таймера
; N2 - значение для автозагрузки второго таймера
; N3 - значение для автозагрузки третьего таймера
; и даёт старт началу отсчета

SystemTimersRead()
; возвращает массив из трёх элементов
; [n1,n2,n3]
; n1 - текущее значение первого таймера
; n2 - текущее значение второго таймера
; n3 - текущее значение третьего таймера


То есть Вася может теперь спокойно посчитать количество тактов процессора, за которое выполнится его функция.

Код: AutoIt [Выделить]
SystemTimersInit(N1,N2,N3)
myfunc()
$N_array = SystemTimersRead()


И всё бы хорошо, но 16-битного счетчика хватит для измерения всего лишь 65535 тактов (для процессора с 2 ГГц это всего лишь 65,5 микросекунд)
Помоги Васе разработать алгоритм измерения периодов времени длинной в несколько часов.
« Последнее редактирование: Декабрь 05, 2012, 17:40:21 от C2H5OH »
Рано или поздно все станет понятно, все станет на свои места и выстроится в единую красивую схему, как кружева. Станет понятно, зачем все было нужно, потому что все будет правильно.

Русское сообщество AutoIt


Оффлайн inververs [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 2135
  • Репутация: 460
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
как то туго пошло, 8) какое максимальной число могут принимать параметры n1 n2 n3?

Оффлайн C2H5OH [?]

  • Знаю я тут одно место с офигенными циркулями...
  • AutoIt Гуру
  • *****
  • Сообщений: 1473

  • Автор темы
  • Репутация: 332
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
Цитировать
какое максимальной число могут принимать параметры n1 n2 n3?
беззнаковое 16-битное, то есть от 0 до 65535

Оффлайн inververs [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 2135
  • Репутация: 460
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
Эта задача имеет решения? интересно :think:

Русское сообщество AutoIt

Re: [Все] Определение тактов процессора между двумя событиями.
« Ответ #3 Отправлен: Декабрь 05, 2012, 19:31:54 »

Оффлайн C2H5OH [?]

  • Знаю я тут одно место с офигенными циркулями...
  • AutoIt Гуру
  • *****
  • Сообщений: 1473

  • Автор темы
  • Репутация: 332
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
Попробую на пальцах объяснить.
Есть три счетчика. На каждом такте процессора значение каждого счетчика уменьшается на 1. Если счетчик достиг нуля, то его значение устанавливается в стартовое (N1,N2,N3 соответственно).
В любой момент времени можно текущее считать значение всех трёх счетчиков t1,t2,t3.

Нужно:
1. Предложить вариант начальных значений счётчиков - N1, N2, N3 (тех самых которые потом загружаюся при каждом дистижении 0)
2. По снятым текущим показаниям счетчиков t1,t2,t3 рассчитать сколько тактов прошло с момента старта.

Цитировать
Эта задача имеет решения? интересно
Ещё как имеет! :)

Оффлайн inververs [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 2135
  • Репутация: 460
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
А то что процессор 2 Ггц, играет роль?

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7814
  • Репутация: 2282
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
C2H5OH
Ты уверен что задача для «Всех»? :whistle:


Правила, Поиск, Супер тема


AutoIt is simple, subtle, elegant.


«Не оказываю тех. поддержку через ПМ/ICQ, и по электронной почте - для этого есть форум. (C)»
«Законы Мэрфи неоспоримы!»


Мои работы

Оффлайн C2H5OH [?]

  • Знаю я тут одно место с офигенными циркулями...
  • AutoIt Гуру
  • *****
  • Сообщений: 1473

  • Автор темы
  • Репутация: 332
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
Цитировать
А то что процессор 2 Ггц, играет роль?
inververs
Процессор роли не играет. Играет роль то, что измеряемы промежуток времени больше чем один проход счетчика. То есть счетчики успеют обнулиться несколько раз.

CreatoR
Задача для ВСЕХ ЖЕЛАЮЩИХ. Если человек новичок в AutoIt, это вовсе не означает что у него соображалка хуже работает.
 :think:

Русское сообщество AutoIt

Re: [Все] Определение тактов процессора между двумя событиями.
« Ответ #7 Отправлен: Декабрь 05, 2012, 19:53:26 »

Оффлайн Kaster [?]

  • Бритва, Бритва Оккама
  • Глобальный модератор
  • *
  • Сообщений: 4020
  • Репутация: 622
  • Пол: Мужской
  • Мой Аватар, он лучший самый
    • Награды
  • Версия AutoIt: 3.3.14.0
по моему эта задача имеет ну очень косвенное отношение к AutoIt, да и к какому-то ЯП в целом. Тут скорее базовая логика. Само решение займет пару не очень длинных предложений.
Конференция посвященная AutoIt на jabber.ru - [email protected]
Как попасть на конференцию читаем тут


Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7814
  • Репутация: 2282
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
C2H5OH  [?]
Цитировать
Если человек новичок в AutoIt, это вовсе не означает что у него соображалка хуже работает.
С этим можно поспорить ;) (учитывая что человек действительно новичок, а не просто только недавно залогинился на сайте но уже имеет знания).
Соображение включает в себя знание, тяжело соображать в области которую плохо понимаешь.

Ну это так, к слову, в данном случае тут действительно AutoIt всего лишь как посредник для выполнения задачи.

Оффлайн Kaster [?]

  • Бритва, Бритва Оккама
  • Глобальный модератор
  • *
  • Сообщений: 4020
  • Репутация: 622
  • Пол: Мужской
  • Мой Аватар, он лучший самый
    • Награды
  • Версия AutoIt: 3.3.14.0
Хотя нет, вру. Учитывая, что счетчиков три объяснение займет больше двух предложений  ;D

Оффлайн InnI [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 3655
  • Репутация: 968
    • Награды
  • Версия AutoIt: 3.3.14.0
OffTopicC2H5OH  [?]
Цитировать
Помоги Васе разработать алгоритм измерения периодов времени длинной в несколько часов.
Тут главное не перейти ту зыбкую границу, где заканчивается конкурс и начинается "Стол заказов" :)

Оффлайн C2H5OH [?]

  • Знаю я тут одно место с офигенными циркулями...
  • AutoIt Гуру
  • *****
  • Сообщений: 1473

  • Автор темы
  • Репутация: 332
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
Цитировать
по моему эта задача имеет ну очень косвенное отношение к AutoIt, да и к какому-то ЯП в целом. Тут скорее базовая логика. Само решение займет пару не очень длинных предложений.

Как бы...
Вот, например, задача реализации RSA схемы. Она имеет отношение к какому-то ЯП в целом?
Если бы мы объявили конкурс "написать функции RSA алгоритма для маленьких чисел" (маленьких означает что в ходе вычислений мы оперируем только числами в формате принятом в AutoIt). Вот такой конкурс был бы актуален с точки зрения написания скрипта AutoIt? С точки зрения познаний в математике, RSA представляет какую-то сложность?

Предложенная задача имеет тот же порядок сложности и с точки зрения математики, и с точки зрения программирования.
Хотел выложить описание задачи, но в Википедии она идёт уже с примером кода на C. Так что...

Вообще-то, не смотря на кажущуюся простоту, в школе про RSA не рассказывают.
Может и в этой задаче нужно поставить требуемый уровень подготовки. Хотя при решении используются понятия в рамках школьного курса.

Взяли бы лучше задачу про граф. Там просто перебор. Читстое программирование.  ;D


Оффлайн firex [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 940
  • Репутация: 202
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
В общем сегодня на паре английского пришла в голову идея помочь Васе.
Концепция проста, поставить три счетчика с параметрами (X), (X-Y), (X-2Y) без возможности деления.
За каждый проход за границы нуля разность (по умолчанию Y и 2Y-Z) будет меняться закономерно(к примеру: 17, 14, 9); X=17/Y=3/Z=2.
Далее посмотрим что из этого выйдет:
Q1| 17, 14, 9
Q2| 8, 5, 0(9)
Q3| 16, 10, 0(9)
Q4| 7, 1, 0(9)
Q5| 15, 6, 0(9)

Как мы видим, разность в Q1 между N1 и N2 равна 3;
А в Q3 равна 6.
А в Q5 равна 9.

Посчитав разницу между N1 и N2 можно определить какой проход по счету совершают таймеры. Естественно N1 и N2 должны быть намного больше. Задействовать ко всему прочему можно и N3.
Ответ будет равен (проход*X)+(X-текущее значение N1).

Во пример к трем счетчикам:
X=65535
Y=4

Q1| 65535, 65531, 65527
Q2| 8, 4, 0(65527)
Q3| 16, 8, 0(65527)
Q4| 24, 12, 0(65527)

Мы совершили тактов: ((X-2Y) * ((N1-N2)/4))+((X-2Y) - N3)

А теперь само решение:

Код: AutoIt [Выделить]
$X = 65535
$Y = 4
SystemTimersInit($X,$X-$Y,$X-(2*$Y))
__MyFunc()
$iArray = SystemTimersRead()

MsgBox(64, '', 'Тактов: ' & (($X-(2*$Y)) * (($iArray[1]-$iArray[2])/4))+(($X-(2*$Y)) - $iArray[3]))


По мере записи сообщения я несколько раз доработал идею.
Так что читайте лучше конец :3
« Последнее редактирование: Декабрь 06, 2012, 12:30:24 от firex »

Оффлайн C2H5OH [?]

  • Знаю я тут одно место с офигенными циркулями...
  • AutoIt Гуру
  • *****
  • Сообщений: 1473

  • Автор темы
  • Репутация: 332
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
firex
мы получим значения счётчиков в любой момент времени.
Например, через 20 тактов после твоего события Q4, у нас будет
Q1| 65535, 65531, 65527
Q2| 8, 4, 0(65527)
Q3| 16, 8, 0(65527)
Q4| 24, 12, 0(65527)
Q4+20| 4, 65523, 65519

Русское сообщество AutoIt

Re: [Все] Определение тактов процессора между двумя событиями.
« Ответ #14 Отправлен: Декабрь 06, 2012, 12:38:39 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
1 Ответов
4483 Просмотров
Последний ответ Январь 14, 2011, 12:10:56
от NoMad73rus
4 Ответов
3983 Просмотров
Последний ответ Март 22, 2017, 14:11:44
от mrsoros
4 Ответов
1874 Просмотров
Последний ответ Июль 14, 2013, 00:16:00
от Zalman1980
2 Ответов
2084 Просмотров
Последний ответ Сентябрь 30, 2013, 18:34:54
от Zalman1980
9 Ответов
3852 Просмотров
Последний ответ Октябрь 13, 2016, 14:35:56
от ra4o
0 Ответов
875 Просмотров
Последний ответ Октябрь 18, 2014, 15:35:38
от Nefakt
4 Ответов
1347 Просмотров
Последний ответ Декабрь 04, 2014, 09:37:57
от shyra1976
1 Ответов
2066 Просмотров
Последний ответ Январь 27, 2016, 15:52:21
от InnI
2 Ответов
1112 Просмотров
Последний ответ Февраль 01, 2017, 20:47:20
от Qweezy
9 Ответов
883 Просмотров
Последний ответ Май 29, 2017, 19:32:34
от Prog