|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Июн 29, 2003 16:33:44 · Поправил: Black_mirror Quantum Ты был прав, без цикла получается быстрее, только вот не понятно на сколько. Оба варианта написал на асме и вставил в код, замеряющий время(а не сделал их ввиде функций). Код для замера времени сказал что он выполнится за 11 тактов(rdtsc/mov ebx,eax/.../rdtsc). Этот код был заключен в цикл, который выполнял замер 65536 раз, и сохранял минимальный результат. Вариант без цикла(для подсчета бит) работал 51 такт, с циклом - 107. Проверял на eax=0ffffffffh. Затем выровнял метку для организации внешнего цикла, и метку во втором варианте. Первый вариант стал работать за 14(!!) тактов, а второй за 90. Вообщем я не понимаю прочему такая большая разница: 51 и 14 тактов ... Вернее не понимаю почему такая большая разника для кода в котором вообще нет переходов?! |
|
|
Дата: Июл 1, 2003 09:39:13 >... почему такая большая разника для кода в > котором вообще нет переходов?! Насколько мне позволяют судить мои скромные познания и опыт работы с конвеером, проц тормозит тогда, когда: 1) Он неправильно предсказывает переход; 2) Всегда лучше, когда условный переход редко выполняется, вот у Зубкова есть такой пример: ; Процедура rand ; возвращает в ЕАХ случайное положительное 32-; битное число ; (от 0 до 231-2) ; rand proc near push edx ; считать последнее случайное число mov eax,dword ptr seed ; проверить его, если это -1, test eax,eax ; функция еще ни разу не js fetch_seed ; вызывалась и надо создать ; начальное значение randomize: ; умножить на число а, mul dword ptr rand_a ; взять остаток от ; деления на 231-1 div dword ptr rand_m mov eax,edx ; сохранить для ; следующих вызовов mov dword ptr seed,eax pop edx ret fetch_seed: push ds push 0040h pop ds mov eax,dword ptr ds:006Ch ; считать ; двойное слово из области pop ds ; данных BIOS по адресу ; 0040:0060 - текущее число jmp short randomize ; тактов таймера Видимо, дело в этом ? |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.072 |