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