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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.11.2024, 02:08   #1
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 681
По умолчанию Почему меньшая процедура занимает больше места?

Дано два варианта кода
Код:
asm
  push edx
  call CreateButton
  pop edx
  mov ecx, edx
  shr ecx, 16
  and edx, $0000FFFF
  push eax
  call SetBounds2575
  pop eax
end;
Код:
asm
  mov ecx, 1638475
  call CreateButtonZip
end;
Второй код явно меньше по размерам. Но по какой-то причине, после компиляции, второй код занимает больше места. Почему?
Kronos913 вне форума Ответить с цитированием
Старый 19.11.2024, 09:40   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,815
По умолчанию

Потому что CreateButtonZip делает что-то больше, чем вызовы CreateButton и SetBounds.
p51x вне форума Ответить с цитированием
Старый 19.11.2024, 21:49   #3
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 681
По умолчанию

Функция CreateButtonZip присутствует в программе не зависимо от этой процедуры
И вызывается в том числе и из других мест программы
Kronos913 вне форума Ответить с цитированием
Старый 20.11.2024, 00:12   #4
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,778
По умолчанию

Цитата:
Сообщение от Kronos913 Посмотреть сообщение
второй код занимает больше места
С чего вы взяли, что он занимает больше места? Где смотрели? Откройте в отладчике и сравните код.
Arigato вне форума Ответить с цитированием
Старый 20.11.2024, 07:43   #5
Алексей1153
фрилансер
Участник клуба
 
Регистрация: 11.10.2019
Сообщений: 1,032
По умолчанию

Kronos913, скорее всего, код функции не добавляется в модуль, если функция не вызывается
Алексей1153 вне форума Ответить с цитированием
Старый 03.12.2024, 17:33   #6
hexor_boo
Разъяснятор
Форумчанин
 
Аватар для hexor_boo
 
Регистрация: 21.04.2022
Сообщений: 142
По умолчанию

Цитата:
Сообщение от Kronos913 Посмотреть сообщение
Дано два варианта кода
Код:
asm
  push edx
  call CreateButton
  pop edx
  mov ecx, edx
  shr ecx, 16
  and edx, $0000FFFF
  push eax
  call SetBounds2575
  pop eax
end;
Код:
asm
  mov ecx, 1638475
  call CreateButtonZip
end;
Второй код явно меньше по размерам. Но по какой-то причине, после компиляции, второй код занимает больше места. Почему?
Могу ошибаться, но: теоретически компилятор может заменять инструкцию "call XYZ" на сам код процедуры "XYZ" из соображений "оптимизации", которая порой может быть весьма "неоптимальной" в каждом отдельно взятом случае.
hexor_boo вне форума Ответить с цитированием
Старый 03.12.2024, 19:15   #7
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,815
По умолчанию

Цитата:
Сообщение от hexor_boo Посмотреть сообщение
Могу ошибаться
Наполовину. Компилятор может заменять, но неоптимальной эта замена будет в очень-очень малых случаях. В современных компиляторах оптимизаторы хороши, да и эвристиков накрутили.
p51x вне форума Ответить с цитированием
Старый 03.12.2024, 19:42   #8
hexor_boo
Разъяснятор
Форумчанин
 
Аватар для hexor_boo
 
Регистрация: 21.04.2022
Сообщений: 142
По умолчанию

Хех. Вспомнил как оптимизировал вставкой asm какую-то простую операцию в Delphi 7. Резюме: выбросил несколько инструкций по сравнению с кодом компилятора и в критичном месте (цикл) код показал более высокую скорость.

Сюда же воспоминание о рассказе препода по информатике. Писали свою ОС. Была какая-то огромная таблица данных, массив. Препод немного подумал и заменил таблицу несложной функцией. Так его чуть не на руках потом носили как "крутого оптимизатора"
hexor_boo вне форума Ответить с цитированием
Старый 03.12.2024, 19:54   #9
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,815
По умолчанию

Цитата:
Сообщение от hexor_boo Посмотреть сообщение
Хех. Вспомнил как оптимизировал вставкой asm какую-то простую операцию в Delphi 7. Резюме: выбросил несколько инструкций по сравнению с кодом компилятора и в критичном месте (цикл) код показал более высокую скорость.
А также учли все краевые случаи, работу со стеком и прочее... или просто у вас был частный случай и вы его закодили?

Цитата:
Сообщение от hexor_boo Посмотреть сообщение
Была какая-то огромная таблица данных, массив. Препод немного подумал и заменил таблицу несложной функцией. Так его чуть не на руках потом носили как "крутого оптимизатора"
Очень показательный пример уровня и оптимизатора, и носильщиков. Нам еще на уроках информатики рассказывали, что бывает оптимизация по размеру и скорости. Синус тоже можно и таблицой считать, и функцией...
p51x вне форума Ответить с цитированием
Старый 04.12.2024, 01:00   #10
hexor_boo
Разъяснятор
Форумчанин
 
Аватар для hexor_boo
 
Регистрация: 21.04.2022
Сообщений: 142
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
частный случай и вы его закодили
да, я не учитывал особенности работы со стеком - есть вероятность, что в результате работы программы могла нарушаться работа с памятью и её освобождением - понимаю - видимых сбоев не было и результат по скорости был на первом месте по значимости

Цитата:
Сообщение от p51x Посмотреть сообщение
Очень показательный пример уровня и оптимизатора, и носильщиков. Нам еще на уроках информатики рассказывали, что бывает оптимизация по размеру и скорости. Синус тоже можно и таблицой считать, и функцией...
Я забыл добавить - там задача была именно в оптимизации по размеру. А таблица осталась, как артефакт от старых разработок, насколько я понял.
hexor_boo вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Каким образом отмечают места в шаблоне, для вставки текста в нужные места ? Серегй N. Microsoft Office Word 13 15.06.2020 07:51
webbrowser при обновлении страницы занимает больше оперативной памяти КатяСаша Общие вопросы Delphi 10 01.11.2016 18:44
Определить, сколько места занимает программа в памяти kolian87 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 7 26.01.2015 07:47
Процедура не позволяет передать больше одного параметра Maryver Microsoft Office Excel 5 15.08.2011 19:11
почему не работает процедура? MyLastHit Общие вопросы Delphi 5 20.08.2010 22:05