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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.11.2011, 22:08   #1
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию что эффективнее?

что эффективнее Odd или n mod 2 <> 0? а как доказать?
З.Ы доказать то я и сам смогу если подскажете как посмотреть какая программа работает быстрее?
Poma][a вне форума Ответить с цитированием
Старый 09.11.2011, 22:14   #2
Camaro Chevelle
Форумчанин
 
Регистрация: 05.11.2011
Сообщений: 102
По умолчанию

лучше всего вообще имхо n and 1<>0. odd примерно так же
а mod это операция деления которая вроде считается что долго выполняется
но вообще современные компиляторы умеют сами мод 2 заменять на and 1
Camaro Chevelle вне форума Ответить с цитированием
Старый 09.11.2011, 22:27   #3
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Цитата:
Сообщение от Camaro Chevelle Посмотреть сообщение
лучше всего вообще имхо n and 1<>0. odd примерно так же
а mod это операция деления которая вроде считается что долго выполняется
но вообще современные компиляторы умеют сами мод 2 заменять на and 1
спасибо но мне на ТУРБО ПАСКАЛЕ и именно mod и Odd просто на одном сайте с модератором повздорили..... и можно все-таки функцию?

Последний раз редактировалось Poma][a; 09.11.2011 в 22:34.
Poma][a вне форума Ответить с цитированием
Старый 09.11.2011, 23:29   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

способ #1.
пишете программу, которая проверяет числа в цикле.
цикл делаете побольше (ну на 100 миллионов иттераций, например.
Перед циклом берете время в миллисекундах.
Код:
var
  Ticks      : LongInt  absolute 0:$46c;
после цикла берёте время.
Находите разницу.

меняете в цикле odd на mod 2 - вставляете в тот же цикл. запускаете.
Запускать надо хотя бы два-три раза каждую из программ и желательно попеременно. (чтобы уменьшить влияние внешних факторов - загрузку ОС и т.д.)

способ #2. - правильный!!!
смотрите ассемблерный код, который генерит Паскаль для этих команд и считаете такты выполнения для одной и другой команды.

исходный код программы:
Код:
var n : integer;
 k : integer;
begin
  Read(n);
  If odd(n) then Inc(k);
  if n mod 2 <> 0 then Inc(k);
полученный ассемблерный листинг:
Код:
PROGRAM.5:  If odd(n) then Inc(k);
  cs:0026 A05200         mov    al,[0052]
  cs:0029 D0E8           shr    al,1
  cs:002B 7304           jnb    PROGRAM.6 (0031)
  cs:002D FF065400       inc    word ptr [0054]
PROGRAM.6:  if n mod 2 <> 0 then Inc(k);
  cs:0031 A15200         mov    ax,[0052]
  cs:0034 99             cwd
  cs:0035 B90200         mov    cx,0002
  cs:0038 F7F9           idiv   cx
  cs:003A 92             xchg   dx,ax
  cs:003B 09C0           or     ax,ax
  cs:003D 7404           je     PROGRAM.7 (0043)
  cs:003F FF065400       inc    word ptr [0054]
очевидно, что команда ODD() НАМНОГО эффективнее и быстрее!

Последний раз редактировалось Serge_Bliznykov; 09.11.2011 в 23:31.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 10.11.2011, 17:54   #5
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Спасибо огромное! только можно вопрос : как посмотреть ассемблерный код?
Poma][a вне форума Ответить с цитированием
Старый 10.11.2011, 18:45   #6
Camaro Chevelle
Форумчанин
 
Регистрация: 05.11.2011
Сообщений: 102
По умолчанию

в комплекте с паскалем идёт turbo debugger (td.exe), через него смотрят
Camaro Chevelle вне форума Ответить с цитированием
Старый 10.11.2011, 23:39   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Camaro Chevelle
в комплекте с паскалем идёт turbo debugger (td.exe), через него смотрят
"Ты знал, ты знал!" :-D

Да, точно. Вышеприведённый листинг взят именно из окошка TurboDebugger'а.
Воспользовался им, т.к. сгенерил паскалевский код с отладочной информацией в EXE, а он понимает формат этой самой отладочной информации.

А так код можно посмотреть любым дебаггером/дизассемблером (ну, разумеется, "понимающим" 16-битный ассемблерный код...)
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
что получиться из этого кода? или что мы ищем через него? kroatoani Общие вопросы Delphi 5 23.10.2010 17:18
Что нужно знать (сделать), что бы прога запускалась в Виндос 7 и Виста marina15056 Помощь студентам 19 24.08.2010 11:29
Товарищи модераторы за что удалили мою Тему? Или я что то не втыкаю!? Олег Егоров Помощь студентам 0 19.05.2010 19:39
Как узнать что в содержимое буфера обмена добавилось что либо? zotox Общие вопросы Delphi 2 15.09.2009 12:07