![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Miha777 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 29.10.2005 Репутация: нет Всего: нет |
Подскажите, пожалуйста, почему код, который выполняется в DOSе выполняется каждый раз за разное колличество процессорных тактов (замеряю RDTSC до кода и после выполнения кода, формирую разницу, при следующем запуске приложения эта разница уже другая)
|
|||
|
||||
| rsm |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 999 Регистрация: 16.3.2005 Репутация: 2 Всего: 62 |
1. Инструкцию rdtsc нужно использовать правильно, в соответствии с рекомендациями Intel:
2. На время выполнения замера времени устанавливай своей программе высший приоритет - это позволит свести к минимуму влияние посторонних приложений. 3. Более-менее высокая точность достигается только в случае, когда минимальный промежуток времени составляет 50~100 тактов. Вообще, штатными средствами процессора измерять время выполнения отдельных команд невозможно - нет достаточной точности. |
|||
|
||||
| Miha777 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 29.10.2005 Репутация: нет Всего: нет |
Дело немного не в этом, я выполняю определенный код n-е количество раз (порядка млн) и определяю количество затраченых процессорных тактов. Все это происходит в однозадачной ОС - DOS, но этот код почему-то выполняется за разное количество этих тактов, почему так происходит?
_asm{ xor eax,eax xor edx,edx db 0x0f,0x31 //rdtsc mov edx1,edx mov eax1,eax } ;---------------------------------------------------------- _asm mov eax,num // num - колличество раз m3: _asm dec eax _asm jz en_d _asm jmp m3 en_d: ;------------------------------------------------------- _asm{ xor eax,eax xor edx,edx db 0x0f,0x31 mov edx2,edx mov eax2,eax } В edx1, eax1 - начало ; edx2, eax2 - конец Делаю несколько запусков в DOSе с одним и тем же num, но результат почему-то отличается (при num=1000000 розличие порядка 10 единиц) |
|||
|
||||
| rsm |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 999 Регистрация: 16.3.2005 Репутация: 2 Всего: 62 |
Еще раз повторю - используй официальный способ вызова rdtsc. У меня тоже иногда разброс просто огромный (см. аттач). Но 99% результатов аналогичны.
Это сообщение отредактировал(а) rsm - 29.10.2005, 20:57 Присоединённый файл ( Кол-во скачиваний: 2 )
rdtsc.zip 42,39 Kb |
|||
|
||||
| Miha777 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 29.10.2005 Репутация: нет Всего: нет |
rsm, я тебя прекрасно понял, пусть даже если rdtsc вызывать так как ты говориш, в Windows - разброс значений понятен в следствии ее многозадачности, но ПОЧЕМУ В DOSе один код выполняется за разное количество тактов? Меня интересует именно почему так происходит! (даже при вызове rdtsc по рекомендациям Intel)
|
|||
|
||||
| rsm |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 999 Регистрация: 16.3.2005 Репутация: 2 Всего: 62 |
Очень грубо и приближенно говоря, работа компа выглядит так: происходит постоянное переключение процессора с задачи на задачу. Под задачей подразумевается любое действие, являющее собой пересылку и обработку данных, будь то получение известия от клавиатуры, опрос таймера времени или выполнение n-го шага некой программы под управлением некой ОСи. Теоретически, получить достаточно точный результат работы команды rdtsc на обычном компе можно единственным способом: оставить только процессор, удалить полностью всю периферию (кроме той, которая обеспечивает его работоспособность) и управлять им путем прямой подачи импульсов с блока управления. Практически это можно реализовать так: взять микроконтроллер, написать для него программу и тестировать время выполнения команд пока не надоест. Это сообщение отредактировал(а) rsm - 29.10.2005, 22:54 |
|||
|
||||
| Miha777 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 29.10.2005 Репутация: нет Всего: нет |
rsm, пасибо за ответы, я подумаю над етим
|
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |