Что нового

[Все] Определение тактов процессора между двумя событиями.

C2H5OH

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

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


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

Код:
SystemTimersInit(N1,N2,N3)
myfunc()
$N_array = SystemTimersRead()


И всё бы хорошо, но 16-битного счетчика хватит для измерения всего лишь 65535 тактов (для процессора с 2 ГГц это всего лишь 65,5 микросекунд)
Помоги Васе разработать алгоритм измерения периодов времени длинной в несколько часов.
 

inververs

AutoIT Гуру
как то туго пошло, 8) какое максимальной число могут принимать параметры n1 n2 n3?
 
Автор
C2H5OH

C2H5OH

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

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

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

CreatoR

Must AutoIt!
Команда форума
Администратор
C2H5OH
Ты уверен что задача для «Всех»? :whistle:
 
Автор
C2H5OH

C2H5OH

AutoIT Гуру
А то что процессор 2 Ггц, играет роль?
inververs
Процессор роли не играет. Играет роль то, что измеряемы промежуток времени больше чем один проход счетчика. То есть счетчики успеют обнулиться несколько раз.

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

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
по моему эта задача имеет ну очень косвенное отношение к AutoIt, да и к какому-то ЯП в целом. Тут скорее базовая логика. Само решение займет пару не очень длинных предложений.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
C2H5OH [?]
Если человек новичок в AutoIt, это вовсе не означает что у него соображалка хуже работает.
С этим можно поспорить ;) (учитывая что человек действительно новичок, а не просто только недавно залогинился на сайте но уже имеет знания).
Соображение включает в себя знание, тяжело соображать в области которую плохо понимаешь.

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

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Хотя нет, вру. Учитывая, что счетчиков три объяснение займет больше двух предложений ;D
 

InnI

AutoIT Гуру
OffTopic:
C2H5OH [?]
Помоги Васе разработать алгоритм измерения периодов времени длинной в несколько часов.
Тут главное не перейти ту зыбкую границу, где заканчивается конкурс и начинается "Стол заказов" :smile:
 
Автор
C2H5OH

C2H5OH

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

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

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

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

firex

AutoIT Гуру
В общем сегодня на паре английского пришла в голову идея помочь Васе.
Концепция проста, поставить три счетчика с параметрами (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)

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

Код:
$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
 
Автор
C2H5OH

C2H5OH

AutoIT Гуру
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
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
C2H5OH
я к тому, что какой смысл использовать ЯП, если решение представляется аналитически? посчитать НОК? найти остатки? :smile:
В качестве подсказки, могу сказать, что наиболее количество тактов можно посчитать, если взять
Код:
$N1 = 2^16-1
$N2 = 2^16-2
$N3 = 2^16-4
 
Автор
C2H5OH

C2H5OH

AutoIT Гуру
я к тому, что какой смысл использовать ЯП, если решение представляется аналитически? посчитать НОК? найти остатки?
Ну, вообще-то так и есть...
:-[


Добавлено:
Сообщение автоматически объединено:

Так а что надо было сразу написать "реализовать расширенный алгоритм Евклида" ?
Это была бы задача для Начинающих. И в чем прикол если тебе дают разжеванный алгоритм, а тебе нужно его только закодировать?
И опять пришел бы Продвинутый и сказал бы
Будут, скажем так, более конкретные-полезные, а не абстрактные, задачи?
И, кстати,
Код:
$N1 = 2^16-1
$N2 = 2^16-2
$N3 = 2^16-3

тоже взаимно простые числа.


Добавлено:
Сообщение автоматически объединено:

Закройте конкурс. Тему перенесите, пожалуйста, в обсуждение конкурсов.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
C2H5OH [?]
тоже взаимно простые числа.
ну, не совсем. вернее, так то оно так, но количество чисел будет
Код:
$N1+1 = 2^16
$N2+1 = 2^16-1
$N3+1 = 2^16-2

а они уже не взаимно простые.
 
Верх