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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.05.2008, 09:19   #1
Иллидан
Форумчанин
 
Регистрация: 16.01.2008
Сообщений: 288
По умолчанию Почему ХОR работает медленно?

В люобой книге написано, что самый быстрый способ поменять значения a и b это с помощью Хоr. Tо есть так:
a:=a xor b;
b:=a xor b;
a:=a xor b;
Но на моем ТP, этот код почему-то работает медленее, чем с введением дополнительной переменной?!
Иллидан вне форума Ответить с цитированием
Старый 01.05.2008, 10:06   #2
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,405
По умолчанию

Наверное так:
Если менять ч/з дополнительную переменную temp, то компилятор
сделает это скорее всего так -
mov eax, [a] -1 такт
mov [temp], eax -1 такт
mov eax, [b] -1 такт
mov [a], eax -1 такт
mov eax, [temp] -1 такт
mov [b], eax -1 такт

- всего 6 тактов

А если ч/з XOR то можно предположить что так -

mov eax, [a] -1 такт
xor eax, [b] -2 такта
mov [a], eax -1 такт

mov eax, [a] -1 такт
xor eax, [b] -2 такта
mov [b], eax -1 такт

mov eax, [a] -1 такт
xor eax, [b] -2 такта
mov [a], eax -1 такт
- всего 12 тактов (т.е. в два раза медленнее)

Насчёт - xor eax, [b] -2 такта - это на .486

А вообще чтобы точно ответить на этот вопрос можно дизассемблить и посмотреть
чего же там на самом деле понаделал ваш компилятор.
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Старый 01.05.2008, 13:06   #3
Иллидан
Форумчанин
 
Регистрация: 16.01.2008
Сообщений: 288
По умолчанию

Ulex, получается, что хor работает быстрее только на ассемблере?
Иллидан вне форума Ответить с цитированием
Старый 01.05.2008, 13:14   #4
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

В Delphi есть более-менее нормальная (хотя и не всегда) оптимизация. А TP - это 16-битный код в 32-битной системе на 32-битном процессоре, неизвестно, что и ждать. Что-то тут все так просто считают такты... процессор - устройство сложное.
Цитата:
mov [a], eax
mov eax, [a]
Delphi иногда реально так делает ((
Что по основному вопросу - не видел книг, где написано, что xor - самый быстрый способ.
P.S. На C вообще красиво a^=b^=a^=b.
Somebody вне форума Ответить с цитированием
Старый 01.05.2008, 13:33   #5
Иллидан
Форумчанин
 
Регистрация: 16.01.2008
Сообщений: 288
По умолчанию

Проверил на 32-разрядном FPC. C Xor работает примерно два раза медленее.
Цитата:
Что по основному вопросу - не видел книг, где написано, что xor - самый быстрый способ.
Ну, например, возьмем того же самого Калашникова.
Иллидан вне форума Ответить с цитированием
Старый 01.05.2008, 14:51   #6
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,405
По умолчанию

Цитата:
получается, что хor работает быстрее только на ассемблере?
Я бы сказал на ассемблере он работает так как этого хочу я (программист), а на любом высокоуровневом компиляторе он будет работать так как этого хотят разработчики компилятора (с небольшими поправками под вкл\выкл оптимизацию).

Так а всё-таки дизассемблить, хотя бы ради любопытства
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Почему не работает цикл????? Marsik Помощь студентам 2 22.06.2008 14:16
Почему моя программа РАБОТАЕТ!!! aesoem Общие вопросы Delphi 3 09.05.2008 23:50
Почему не работает код? Kashp Общие вопросы Delphi 3 09.08.2007 17:33