![]() |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
![]() ![]() |
![]() |
}0pa |
![]() ![]()
Сообщение
#1
|
![]() Пионер ![]() ![]() Группа: Пользователи Сообщений: 75 Пол: Мужской Репутация: ![]() ![]() ![]() |
Кто-нибудь может програмно показать отличия между inc(n) и n:=n+1 для целого n. Плз помогите!
-------------------- Ну, а почему бы в свободное время не позаниматься программированием?
|
klem4 |
![]()
Сообщение
#2
|
![]() Perl. Just code it! ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 100 Пол: Мужской Реальное имя: Андрей Репутация: ![]() ![]() ![]() |
Что значит программно показать отличие ? Эти операции выполняют одно и тоже с однаковой скоростью. Ты это хотел услышать ? После компиляции отличиий между inc(n) и n := n + 1 нету никаких.
-------------------- perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
|
Malice |
![]()
Сообщение
#3
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 705 Пол: Мужской Репутация: ![]() ![]() ![]() |
Если делаешь n=n+1 то используется сложение через регистр, если inc, то сразу с памятью. Т.е.:
asm Во всех других вариациях (inc(n,5) и даже inc(n,x)) трансляция таже. Поэтому inc вроде бы лучше.. Все это касается tp. |
volvo |
![]()
Сообщение
#4
|
Гость ![]() |
Цитата Эти операции выполняют одно и тоже с однаковой скоростью. ![]() |
}0pa |
![]()
Сообщение
#5
|
![]() Пионер ![]() ![]() Группа: Пользователи Сообщений: 75 Пол: Мужской Репутация: ![]() ![]() ![]() |
А с помощью Таймера по=моему можно проверить...? Другое дело как?
-------------------- Ну, а почему бы в свободное время не позаниматься программированием?
|
volvo |
![]()
Сообщение
#6
|
Гость ![]() |
|
}0pa |
![]()
Сообщение
#7
|
![]() Пионер ![]() ![]() Группа: Пользователи Сообщений: 75 Пол: Мужской Репутация: ![]() ![]() ![]() |
Вот сделал:
Код 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]; ЗЫ:Уж извините за такое кол-во вопросов. Все-таки хочется узнать! ![]() Сообщение отредактировано: }0pa - 4.12.2006 0:44 -------------------- Ну, а почему бы в свободное время не позаниматься программированием?
|
}0pa |
![]()
Сообщение
#8
|
![]() Пионер ![]() ![]() Группа: Пользователи Сообщений: 75 Пол: Мужской Репутация: ![]() ![]() ![]() |
Ну, уж очень хочется узнать
![]() ![]() ![]() -------------------- Ну, а почему бы в свободное время не позаниматься программированием?
|
Malice |
![]()
Сообщение
#9
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 705 Пол: Мужской Репутация: ![]() ![]() ![]() |
У тебя k - longint, поэтому inc выглядит так:
add w,[k],1 k:=k+1 так: mov ax,[k] Видимо второй вариант лучше распаралеливается.. Если бы тип был byte, word, integer (умещался в регистр), то результат был бы обратный ![]() |
}0pa |
![]()
Сообщение
#10
|
![]() Пионер ![]() ![]() Группа: Пользователи Сообщений: 75 Пол: Мужской Репутация: ![]() ![]() ![]() |
1.Malice, я просто с трудом понимаю, что значит твой код. Но не мог бы ты пояснить построчно, что ты делаешь?
2.Мой вопрос выше остается в силе К тому же, если мы вместо longint используем intger, то Run Time Error -------------------- Ну, а почему бы в свободное время не позаниматься программированием?
|
Malice |
![]()
Сообщение
#11
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 705 Пол: Мужской Репутация: ![]() ![]() ![]() |
1.Malice, я просто с трудом понимаю, что значит твой код. Но не мог бы ты пояснить построчно, что ты делаешь? 2.Мой вопрос выше остается в силе 1. Я показал во что транслируются операции inc и + на ассемблере, т.к. сами операции паскаля - черный ящик и для анализа причин не очень подходят. В первом своем посте я показал, что inc на асме короче и оттого быстрее, во втором - что inc короче, но не быстрее ;) , возможно из-за того, что код с '+' лучше распаралелливается процем. 2. чтобы ответить точнее, нужно почитать какие-нибуть статьи про оптимизацию кода, например на wasm.ru К тому же, если мы вместо longint используем intger, то Run Time Error Не может быть, если только ты tm тоже сделал integer, нужно менять тип только у K. |
hiv |
![]()
Сообщение
#12
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 660 Пол: Мужской Реальное имя: Михаил Репутация: ![]() ![]() ![]() |
Это все относится к вопросу чистоты эксперимента
![]() Вот мой код: program Project1;А вот результаты: Код С дебаг информацией в генерируемом коде: Как видно эти операции абсолютно одинаково генеряться компилятором Delphi7. Разницу в 3% считаю несущественной.#1: 6811 2147483646 #2: 7750 2147483646 Без дебага в коде и отключены всякие проверки: #1: 4921 2147483646 #2: 5078 2147483646 -------------------- Никогда не жадничай. Свои проблемы с любовью дари людям!
|
volvo |
![]()
Сообщение
#13
|
Гость ![]() |
![]() # [13] for i := -2147483647 to 2147483646 do inc(k); # [20] for i := -2147483647 to 2147483646 do k:=k+1; Как видим, что Inc(k), что K := K + 1 заменяются на INCL Другое дело - если K сделать байтовым... Тогда: # [14] for i := -2147483647 to 2147483646 do inc(k); # [21] for i := -2147483647 to 2147483646 do k:=k+1; |
NTL |
![]() ![]()
Сообщение
#14
|
![]() Фанат Delphi ![]() ![]() Группа: Пользователи Сообщений: 72 Пол: Мужской Реальное имя: Сергей Репутация: ![]() ![]() ![]() |
Тогда,пожалуйста,объясните рез-ат моего тестера, который показывает, что m:=m+1 немного работает быстрее чем inc(m).
![]() ЗЫ:Проверял 15 раз ![]() Прикрепленные файлы ![]() -------------------- ICQ (384-043-857)
|
Malice |
![]()
Сообщение
#15
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 705 Пол: Мужской Репутация: ![]() ![]() ![]() |
Потому что у тебя m - longint, читай внимательнее, было уже
![]() |
![]() ![]() |
![]() |
Текстовая версия | 18.07.2025 16:09 |