IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Сравненин
}0pa
сообщение 3.12.2006 1:39
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 75
Пол: Мужской

Репутация: -  0  +


Кто-нибудь может програмно показать отличия между inc(n) и n:=n+1 для целого n. Плз помогите!


--------------------
Ну, а почему бы в свободное время не позаниматься программированием?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
klem4
сообщение 3.12.2006 9:56
Сообщение #2


Perl. Just code it!
******

Группа: Модераторы
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


Что значит программно показать отличие ? Эти операции выполняют одно и тоже с однаковой скоростью. Ты это хотел услышать ? После компиляции отличиий между inc(n) и n := n + 1 нету никаких.


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Malice
сообщение 3.12.2006 10:11
Сообщение #3


Профи
****

Группа: Пользователи
Сообщений: 705
Пол: Мужской

Репутация: -  20  +


Если делаешь n=n+1 то используется сложение через регистр, если inc, то сразу с памятью. Т.е.:

asm
inc word [n] { =inc(i) }

mov ax,[n] {n:=n+1}
inc ax
mov [n],ax
end;


Во всех других вариациях (inc(n,5) и даже inc(n,x)) трансляция таже. Поэтому inc вроде бы лучше..
Все это касается tp.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 3.12.2006 10:39
Сообщение #4


Гость






Цитата
Эти операции выполняют одно и тоже с однаковой скоростью.
no1.gif Для 16-битных компиляторов (проверялось на TP6, возможно в семерке уже более умный компилятор, надо посмотреть) скорость с Inc будет выше... Выигрыш может составлять до 20%... 32-битные вроде научились оптимизировать...
 К началу страницы 
+ Ответить 
}0pa
сообщение 3.12.2006 19:21
Сообщение #5


Пионер
**

Группа: Пользователи
Сообщений: 75
Пол: Мужской

Репутация: -  0  +


А с помощью Таймера по=моему можно проверить...? Другое дело как?


--------------------
Ну, а почему бы в свободное время не позаниматься программированием?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 3.12.2006 19:38
Сообщение #6


Гость






Так как показано здесь:
Улучшение кода

(просто подставь те операторы, которые ты хочешь тестировать)
 К началу страницы 
+ Ответить 
}0pa
сообщение 4.12.2006 0:42
Сообщение #7


Пионер
**

Группа: Пользователи
Сообщений: 75
Пол: Мужской

Репутация: -  0  +


Вот сделал:
Код
uses crt;
const
n = 25000;

var
tm, tm1: longint;
i,j,k: longint;
begin
clrscr;
writeln('n = ', n, ' * ', n);

{----- inc(k); -----}
tm1:= MemL[$0040:$006c];
for i := 1 to n do
  for j := 1 to n do
    begin
      inc(k);
    end;
tm:= MemL[$0040:$006c];
tm:=tm-tm1;
writeln('#1: ',tm);


{----- k:=k+1 -----}
tm1:= MemL[$0040:$006c];
for i := 1 to n do
  for j := 1 to n do
    begin
      k:=k+1
    end;
tm:= MemL[$0040:$006c];
tm:=tm-tm1;
writeln('#2: ',tm);
readkey
end.

Результаты теста:
Код

n=25000*25000
#1:179
#2 133

n=15000*15000
#1:126
#2 96

Но хотелось бы знать, что значут эти рез-ты? Неужели k:=k+1 быстрее?
Что определяют эти массивы? Почему они именно так записаны?

Код

tm1:= MemL[$0040:$006c];
.....................................
tm:= MemL[$0040:$006c];

ЗЫ:Уж извините за такое кол-во вопросов. Все-таки хочется узнать! yes2.gif

Сообщение отредактировано: }0pa - 4.12.2006 0:44


--------------------
Ну, а почему бы в свободное время не позаниматься программированием?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
}0pa
сообщение 4.12.2006 13:59
Сообщение #8


Пионер
**

Группа: Пользователи
Сообщений: 75
Пол: Мужской

Репутация: -  0  +


Ну, уж очень хочется узнать give_rose.gif give_rose.gif give_rose.gif


--------------------
Ну, а почему бы в свободное время не позаниматься программированием?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Malice
сообщение 4.12.2006 14:18
Сообщение #9


Профи
****

Группа: Пользователи
Сообщений: 705
Пол: Мужской

Репутация: -  20  +


У тебя k - longint, поэтому inc выглядит так:

add       w,[k],1
adc w,[k+2],0

k:=k+1 так:
mov       ax,[k]
mov dx,[k+2]
add ax,1
adc dx,0
mov [k],ax
mov [k+2],dx

Видимо второй вариант лучше распаралеливается..
Если бы тип был byte, word, integer (умещался в регистр), то результат был бы обратный yes2.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
}0pa
сообщение 4.12.2006 23:39
Сообщение #10


Пионер
**

Группа: Пользователи
Сообщений: 75
Пол: Мужской

Репутация: -  0  +


1.Malice, я просто с трудом понимаю, что значит твой код. Но не мог бы ты пояснить построчно, что ты делаешь?
2.Мой вопрос выше остается в силе

К тому же, если мы вместо longint используем intger, то Run Time Error


--------------------
Ну, а почему бы в свободное время не позаниматься программированием?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Malice
сообщение 5.12.2006 9:32
Сообщение #11


Профи
****

Группа: Пользователи
Сообщений: 705
Пол: Мужской

Репутация: -  20  +


Цитата(}0pa @ 4.12.2006 23:39) *

1.Malice, я просто с трудом понимаю, что значит твой код. Но не мог бы ты пояснить построчно, что ты делаешь?
2.Мой вопрос выше остается в силе


1. Я показал во что транслируются операции inc и + на ассемблере, т.к. сами операции паскаля - черный ящик и для анализа причин не очень подходят. В первом своем посте я показал, что inc на асме короче и оттого быстрее, во втором - что inc короче, но не быстрее ;) , возможно из-за того, что код с '+' лучше распаралелливается процем.
2. чтобы ответить точнее, нужно почитать какие-нибуть статьи про оптимизацию кода, например на wasm.ru

Цитата(}0pa @ 4.12.2006 23:39) *

К тому же, если мы вместо longint используем intger, то Run Time Error

Не может быть, если только ты tm тоже сделал integer, нужно менять тип только у K.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
hiv
сообщение 5.12.2006 11:48
Сообщение #12


Профи
****

Группа: Пользователи
Сообщений: 660
Пол: Мужской
Реальное имя: Михаил

Репутация: -  11  +


Это все относится к вопросу чистоты эксперимента wink.gif
Вот мой код:
program Project1;
{$APPTYPE CONSOLE}
uses SysUtils, DateUtils;

var
tm,tm1 : TDateTime;
i,k: longint;

begin
k:=-2147483647;
{----- inc(k); -----}
tm1:= Now;
for i := -2147483647 to 2147483646 do inc(k);
tm:= Now;
writeln('#1: ',IntToStr(MilliSecondsBetween(tm,tm1)), #9, IntToStr(k));

k:=-2147483647;
{----- k:=k+1 -----}
tm1:= Now;
for i := -2147483647 to 2147483646 do k:=k+1;
tm:= Now;
writeln('#2: ',IntToStr(MilliSecondsBetween(tm,tm1)), #9, IntToStr(k));
end.
А вот результаты:
Код
С дебаг информацией в генерируемом коде:
#1: 6811        2147483646
#2: 7750        2147483646
Без дебага в коде и отключены всякие проверки:
#1: 4921        2147483646
#2: 5078        2147483646
Как видно эти операции абсолютно одинаково генеряться компилятором Delphi7. Разницу в 3% считаю несущественной.


--------------------
Никогда не жадничай. Свои проблемы с любовью дари людям!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 5.12.2006 12:05
Сообщение #13


Гость






yes2.gif Как я и написал выше - 32 битные компиляторы оптимизируют код... Вот фрагменты ASM-кода для вышеприведенной программы (FPC 2.0.4, в режиме совместимости с Дельфи):

# [13] for i := -2147483647 to 2147483646 do inc(k);
movl $-2147483647,U_P$PROJECT1_I
decl U_P$PROJECT1_I
.balign 4
.L13:
incl U_P$PROJECT1_I
incl U_P$PROJECT1_K
cmpl $2147483646,U_P$PROJECT1_I
jl .L13
.Ll5:
.stabn 68,0,14,.Ll5 - _main


# [20] for i := -2147483647 to 2147483646 do k:=k+1;
movl $-2147483647,U_P$PROJECT1_I
decl U_P$PROJECT1_I
.balign 4
.L61:
incl U_P$PROJECT1_I
incl U_P$PROJECT1_K
cmpl $2147483646,U_P$PROJECT1_I
jl .L61
.Ll10:
.stabn 68,0,21,.Ll10 - _main

Как видим, что Inc(k), что K := K + 1 заменяются на INCL

Другое дело - если K сделать байтовым... Тогда:
# [14] for i := -2147483647 to 2147483646 do inc(k);
movl $-2147483647,U_P$PROJECT1_I
decl U_P$PROJECT1_I
.balign 4
.L13:
incl U_P$PROJECT1_I
incb U_P$PROJECT1_K
cmpl $2147483646,U_P$PROJECT1_I
jl .L13
.Ll5:
.stabn 68,0,15,.Ll5 - _main


# [21] for i := -2147483647 to 2147483646 do k:=k+1;
movl $-2147483647,U_P$PROJECT1_I
decl U_P$PROJECT1_I
.balign 4
.L61:
incl U_P$PROJECT1_I
movzbl U_P$PROJECT1_K,%eax
incl %eax
movb %al,U_P$PROJECT1_K
cmpl $2147483646,U_P$PROJECT1_I
jl .L61
.Ll10:
.stabn 68,0,22,.Ll10 - _main
, и разница во времени выполнения кода уже в 2 раза больше.

 К началу страницы 
+ Ответить 
NTL
сообщение 11.12.2006 18:40
Сообщение #14


Фанат Delphi
**

Группа: Пользователи
Сообщений: 72
Пол: Мужской
Реальное имя: Сергей

Репутация: -  0  +


Тогда,пожалуйста,объясните рез-ат моего тестера, который показывает, что m:=m+1 немного работает быстрее чем inc(m). blink.gif
ЗЫ:Проверял 15 раз wub.gif


Прикрепленные файлы
Прикрепленный файл  ________.PAS ( 5.84 килобайт ) Кол-во скачиваний: 134


--------------------
ICQ (384-043-857)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Malice
сообщение 11.12.2006 19:55
Сообщение #15


Профи
****

Группа: Пользователи
Сообщений: 705
Пол: Мужской

Репутация: -  20  +


Потому что у тебя m - longint, читай внимательнее, было уже yes2.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 18.07.2025 9:45
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"