Кто-нибудь может програмно показать отличия между inc(n) и n:=n+1 для целого n. Плз помогите!
Что значит программно показать отличие ? Эти операции выполняют одно и тоже с однаковой скоростью. Ты это хотел услышать ? После компиляции отличиий между inc(n) и n := n + 1 нету никаких.
Если делаешь n=n+1 то используется сложение через регистр, если inc, то сразу с памятью. Т.е.:
asm
inc word [n] { =inc(i) }
mov ax,[n] {n:=n+1}
inc ax
mov [n],ax
end;
А с помощью Таймера по=моему можно проверить...? Другое дело как?
Так как показано здесь:
http://forum.pascal.net.ru/index.php?s=&showtopic=1741&view=findpost&p=34169
(просто подставь те операторы, которые ты хочешь тестировать)
Вот сделал:
Ну, уж очень хочется узнать
У тебя k - longint, поэтому inc выглядит так:
add w,[k],1
adc w,[k+2],0
mov ax,[k]
mov dx,[k+2]
add ax,1
adc dx,0
mov [k],ax
mov [k+2],dx
1.Malice, я просто с трудом понимаю, что значит твой код. Но не мог бы ты пояснить построчно, что ты делаешь?
2.Мой вопрос выше остается в силе
К тому же, если мы вместо longint используем intger, то Run Time Error
Это все относится к вопросу чистоты эксперимента
Вот мой код:
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.
Как я и написал выше - 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
# [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
Тогда,пожалуйста,объясните рез-ат моего тестера, который показывает, что m:=m+1 немного работает быстрее чем inc(m).
ЗЫ:Проверял 15 раз
Прикрепленные файлы
________.PAS ( 5.84 килобайт )
Кол-во скачиваний: 237
Потому что у тебя m - longint, читай внимательнее, было уже