Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.09.2013, 17:39   #1
alexey_kip
Форумчанин
 
Регистрация: 19.11.2011
Сообщений: 198
Вопрос Время выполнения команды

Необходимо определить время выполнения команды.
В асм'е я не силен, поэтому прошу помощи.
Чтобы правильно определить время нужно все из-под доса делать, как я понимаю. Измерять время 1 команды глупо имхо, поэтому планируется сделать цикл из, например, 10000 одинаковых действий, замеряем его время, потом пускаем пустой цикл и тоже замеряем его время, находим разницу и делим на количество итераций цикла.
Дак вопрос, а как измерить время?
Использую RDTSC.
Вот код:
Код:
RDTSC;
		mov [startA],eax;
		mov [startB],edx;
		mov cx,10000;
loop1:
		mov ax,dx;
		LOOP loop1;
		RDTSC;
		mov [oneA],eax;
		mov [oneB],edx;
		mov cx,10000;
loop2:
		LOOP loop2;
		RDTSC;
		mov [finishA],eax;
		mov [finishB],edx;
Получается какой-то бред. Если, допустим, StartB и oneB равны, то разница startA и oneA дает 118980, я так понимаю, тиков. Если тик взять как 55 мс, то получим 1090,65 минут о_О.
alexey_kip вне форума Ответить с цитированием
Старый 19.09.2013, 18:46   #2
Opterezon
 
Регистрация: 15.09.2013
Сообщений: 8
По умолчанию

Зависит от процессора. Задействовать удастся только одно ядро. Инструкция рода Mov eax,ebx выполняется за 2 такта процессора. Делишь тактовую частоту своего процессора на 2 и получаешь число инструкций, которые твой процессор выполняет за секунду. Но это при голом железе. В ОС это будет работать на порядок медленнее.
Opterezon вне форума Ответить с цитированием
Старый 19.09.2013, 19:03   #3
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

так это, timer stamp counter работает на некоторой частоте, можно поднять мануалы на проц и найти значение этой частоты. но на практике, используется функционал системы для выполнения длительной задержки в несколько секунд (delay_time), определяется кол-во отсчетов TSC для этой задержки (delay_count). ну, а потом, при использовании TSC, считается кол-во отсчетов между двумя событиями (event_count), тогда время между двумя событиями

event_time = event_count*delay_time/delay_count

55 мс - какая-то с потолка взятая цифра.
f.hump вне форума Ответить с цитированием
Старый 19.09.2013, 21:10   #4
alexey_kip
Форумчанин
 
Регистрация: 19.11.2011
Сообщений: 198
По умолчанию

Не с потолка цифра
http://emanual.ru/download/8234.html#ch5_1
Системный таймер тикает 18,2 раз в секунду

f.hump, можно пример хоть какой-нибудь?
alexey_kip вне форума Ответить с цитированием
Старый 19.09.2013, 22:00   #5
vadimych
Форумчанин
 
Регистрация: 16.01.2011
Сообщений: 325
По умолчанию

alexey_kip, Ваш код не имеет ни малейшего отношения к системному таймеру. RDTSC возвращает количество тактов процессора с момента последнего сброса.
vadimych вне форума Ответить с цитированием
Старый 19.09.2013, 22:16   #6
alexey_kip
Форумчанин
 
Регистрация: 19.11.2011
Сообщений: 198
По умолчанию

Я предупредил, что не силен в asm'е и написал, чтобы мне помогли
alexey_kip вне форума Ответить с цитированием
Старый 19.09.2013, 22:44   #7
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

Цитата:
Не с потолка цифра
по той ссылке вообще какой-то довоенный материал. это ж надо, вычилительный блок - одна железяка, счетчик - другая.

Цитата:
RDTSC возвращает количество тактов процессора с момента последнего сброса
только на старых моделях процов, на новых с динамической перестройкой тактовой частоты проца, это не так, потому что чатота обновления TSC не меняется в отличие от тактовой частоты вычислительного ядра.

Цитата:
f.hump, можно пример хоть какой-нибудь?
готового примера нет. думать лень. все что сделал - процитировал манул от Intel.
f.hump вне форума Ответить с цитированием
Старый 20.09.2013, 20:22   #8
alexey_kip
Форумчанин
 
Регистрация: 19.11.2011
Сообщений: 198
По умолчанию

Цитата:
готового примера нет. думать лень. все что сделал - процитировал манул от Intel.
Я не просто так ведь сюда написал. Прошу помощи, а не цитирования мануалов
alexey_kip вне форума Ответить с цитированием
Старый 21.09.2013, 01:04   #9
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,786
По умолчанию

ОС какая? Под Windows нужно использовать QueryPerformanceCounter/QueryPerformanceFrequency, иначе на многоядерных машинах возможна хрень.
Vapaamies вне форума Ответить с цитированием
Старый 21.09.2013, 15:33   #10
alexey_kip
Форумчанин
 
Регистрация: 19.11.2011
Сообщений: 198
По умолчанию

Я DOS планирую использовать. Если я правильно понимаю там одно ядро только участвует и нет лишних фоновых программ
alexey_kip вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
cmd. частично не работает отключение вывода результата выполнения команды goluzov Общие вопросы C/C++ 1 06.12.2012 12:10
Время выполнения команды на С nastya2112 Общие вопросы C/C++ 4 06.11.2012 11:48
Оценка среднего времени выполнения команды(на просто С) nastya2112 Помощь студентам 0 06.11.2012 11:21
Вложенный вызов обработчика ( проще - дублирование выполнения команды) DeKot Общие вопросы Delphi 2 08.01.2012 22:11