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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.09.2022, 16:46   #1
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 627
По умолчанию Сокращение числа вводных

На коленке сделал 2 процедуры для превращение LongWord в 2 Word и обратно
Код:
Function LongWordFrom2Words(const word1, word2:word):LongWord;
asm
  shl eax, 16
  mov ax, dx
end;

Function LongWordTo2Words(const LongWord1:LongWord; var word2:word):Word;
asm
  mov [edx], ax
  shr eax, 16
end;
Собственно, для чего все это задумано: чтобы, если в процедуру заходит куча переменных типа word, большая часть их которых - константы, сократить число вводимых переменных, а внутри процедуры уже "разделять" их

Поскольку большая часть вводимых параметров - константы, их можно вычислить заранее и загнать в секцию const

Вопрос: будет ли такой код оптимальнее?
С одной стороны, при каждом вызове процедуры будет на 1 переменную меньше загоняться в стек
С другой стороны, внутри процедуры надо будет держать внутреннюю переменную, куда будет сохраняться вторая половина кода
Kronos913 вне форума Ответить с цитированием
Старый 08.09.2022, 16:50   #2
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Цитата:
Сообщение от Kronos913 Посмотреть сообщение
Вопрос: будет ли такой код оптимальнее?
Нет. См. комментарий про TRGBtriple в одной из предыдущих тем.

Цитата:
Сообщение от Kronos913 Посмотреть сообщение
С одной стороны, при каждом вызове процедуры будет на 1 переменную меньше загоняться в стек
С другой стороны, внутри процедуры надо будет держать внутреннюю переменную, куда будет сохраняться вторая половина кода
А самое главное не это. Будет 2 дополнительных вызова процедур и при этом куча возьни с регистрами вместо простой упаковки аргументов и адресации к половинкам на уровне оффсетов.

ADD: Если ваши аргументы это константы, тогда выражение my_proc(arg1 shl 16 or arg0) компилятор посчитает еще на уровне компиляции и создаст константу, которая будет передана как один параметр без дополнительной возьни с регистрами во время исполнения программы. Тогда в процедуре вы можете представить это значение как комплексную структуру и они будут разделены на уровне оффсетов аргументов в стеке еще на этапе компиляции (без дополнительной возьни с регистрами во время исполнения программы).

Последний раз редактировалось macomics; 08.09.2022 в 17:35.
macomics вне форума Ответить с цитированием
Старый 08.09.2022, 18:01   #3
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 627
По умолчанию

Если процедура вызывается раз 40 - то каждый раз перед ее вызовом прописывается код загрузки в стек всех параметров

А код вызова процедуры "распаковки" Lword -> 2x Word - один раз в самой процедуре.
Kronos913 вне форума Ответить с цитированием
Старый 08.09.2022, 19:35   #4
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,551
По умолчанию

Цитата:
Сообщение от Kronos913 Посмотреть сообщение
Собственно, для чего все это задумано: чтобы, если в процедуру заходит куча переменных типа word, большая часть их которых - константы, сократить число вводимых переменных, а внутри процедуры уже "разделять" их
Жаль нет смайла фейспалм...

Цитата:
Сообщение от Kronos913 Посмотреть сообщение
будет ли такой код оптимальнее?
Нет. В вашем случае будет оптимальнее перейти на чистый Си.
Arigato вне форума Ответить с цитированием
Старый 08.09.2022, 19:51   #5
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Цитата:
Сообщение от Arigato Посмотреть сообщение
В вашем случае будет оптимальнее перейти на чистый Си.
Лучше сразу на asm
macomics вне форума Ответить с цитированием
Старый 08.09.2022, 19:52   #6
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Цитата:
Сообщение от Kronos913 Посмотреть сообщение
Если процедура вызывается раз 40 - то каждый раз перед ее вызовом прописывается код загрузки в стек всех параметров
Т.е. про передачу параметров через глобальные переменные вы не слышали?

В крайнем случае всегда можно воспользоваться HiWord и LoWord

Последний раз редактировалось macomics; 08.09.2022 в 19:59.
macomics вне форума Ответить с цитированием
Старый 08.09.2022, 20:14   #7
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,551
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
Лучше сразу на asm
Не, Асм жестко слишком. Си будет достаточно, там можно будет как душе угодно параметры туда-сюда передавать
Arigato вне форума Ответить с цитированием
Старый 08.09.2022, 20:35   #8
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Цитата:
Сообщение от Arigato Посмотреть сообщение
Не, Асм жестко слишком
Пока до чистого asm не доберется - не поймет что он делает.
macomics вне форума Ответить с цитированием
Старый 09.09.2022, 12:25   #9
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 627
По умолчанию

Цитата:
Сообщение от Arigato Посмотреть сообщение
Нет. В вашем случае будет оптимальнее перейти на чистый Си.
В универе 1 семест нам давали Си. Но честно говоря, мне не понравился си-шный синтаксис. Delphi пользуюсь потому что это осовремененный Pascal

Потому что то как пишется код на Си - это какой-то взрыв мозга... Равно вместо присваивания, восклицательный знак вместо отрицания...
Kronos913 вне форума Ответить с цитированием
Старый 09.09.2022, 12:38   #10
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Цитата:
Сообщение от Kronos913 Посмотреть сообщение
Равно вместо присваивания, восклицательный знак вместо отрицания...
А удвоение равенства для сравнения - это вообще беспредел!
macomics вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сделать так,чтобы он выводил только ответ на вопрос, без вводных данных? Настя1303 Паскаль, Turbo Pascal, PascalABC.NET 4 28.09.2018 02:05
Сокращение Green4el HTML и CSS 15 07.11.2013 02:37
Оптимизация (сокращение) кода решения задачи #46 c acmp.ru - вывод числа E с заданной точностью Poma][a Паскаль, Turbo Pascal, PascalABC.NET 47 05.07.2013 23:50
сокращение числа переборов для нахождения делителей числа ujif Паскаль, Turbo Pascal, PascalABC.NET 8 13.06.2013 20:33
Сокращение if AxenicX Общие вопросы C/C++ 2 07.11.2009 16:08