![]() |
1. Заголовок или название темы должно быть информативным !
2. Все тексты фрагментов программ должны помещаться в теги [code] ... [/code] или [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ" и используйте ПОИСК !
4. НЕ используйте форум для личного общения!
5. Самое главное - это раздел теоретический, т.е. никаких задач и программ (за исключением небольших фрагментов) - для этого есть отдельный раздел!
![]() ![]() |
![]() |
Nolik |
![]()
Сообщение
#1
|
Группа: Пользователи Сообщений: 6 Пол: Мужской Реальное имя: Илья Репутация: ![]() ![]() ![]() |
С точки зрения скорости исполнения процедуры, как правильнее организовать корректную работу процедуры с большим количеством изменяемых переменных?
1. Сформировать Class, и содержать в нем все необходимые переменные. Передавать в процедуру в качестве параметра Class. Теперь процедура работает с переменными, содержащимися в Class: Код MyProcedure( Class:MyClass ); begin Class.var1 := Class.var2 + Class.var3; End; 2. Определить переменные в начале программы НО НЕ передавать их в MyProcedure в качестве параметров, а позволить процедуре работать с внешними (для нее) переменным: Код var1; var2…….varN MyProcedure(); begin var1:= var2 + var3; End; |
Altair |
![]()
Сообщение
#2
|
![]() Ищущий истину ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 824 Пол: Мужской Реальное имя: Олег Репутация: ![]() ![]() ![]() |
![]() Или ты под class имеешь ввиду переменную ? вообще функция - понятие математическое, поэтому передавать надо точные параметры.... Зачем тебе усложнять все и скидывать в какой то "контейнер" ? да и по скорости любая самостоятельная переменная будет быстрее чем группа связанных... -------------------- Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С) |
volvo |
![]()
Сообщение
#3
|
Гость ![]() |
Цитата 2. Определить переменные в начале программы НО НЕ передавать их в MyProcedure в качестве параметров, а позволить процедуре работать с внешними (для нее) переменным: Я бы не рекомендовал так делать... Обращение к глобальным переменным из подпрограммы - очень плохая практика, с подпрограммой надо общаться через передаваемые значения.Если у тебя настолько большое количество изменяемых переменных - не лучше ли разбить процедуру на несколько? "Не пытайтесь объять необъятное" (С) Козьма Прутков... |
hardcase |
![]()
Сообщение
#4
|
![]() code warrior ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 484 Пол: Мужской Реальное имя: Славен Репутация: ![]() ![]() ![]() |
С точки зрения скорости исполнения процедуры, как правильнее организовать корректную работу процедуры с большим количеством изменяемых переменных? Это зависит от соглашений о взове процедуры. Если параметров 3-4 и протокол __fastcall или register - то явно передавать параметры будет быстрее, чем записывать во внешние контейнеры. Если передача параметров обычная - через стек, то вызовы будут эквивалентны. Но иногда вызов без параметров будет быстрее, хотя всё равно, в процедуре, если ты будешь обращаться к внешним глобальным переменным, ты же не знаешь в каком сегменте они размещены - и какбы не пришлось по дальнему указателью к ним обращаться.Таким образом - передавай параметры явно - это и наглядней и во многих случаях выстрее. -------------------- ИзВ ин ИтЕ зА нЕ рОв НЫй П оч ЕРк
|
Nolik |
![]()
Сообщение
#5
|
Группа: Пользователи Сообщений: 6 Пол: Мужской Реальное имя: Илья Репутация: ![]() ![]() ![]() |
Низкий поклон для volvo и hardcase,
Теперь остается вопрос каким способом (объектом/классом/контейнером) лучше заслать переменные в процедуру??? С уважением, Илья. |
hardcase |
![]()
Сообщение
#6
|
![]() code warrior ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 484 Пол: Мужской Реальное имя: Славен Репутация: ![]() ![]() ![]() |
А разве просто перечислить не получается?
-------------------- ИзВ ин ИтЕ зА нЕ рОв НЫй П оч ЕРк
|
Nolik |
![]()
Сообщение
#7
|
Группа: Пользователи Сообщений: 6 Пол: Мужской Реальное имя: Илья Репутация: ![]() ![]() ![]() |
А разве просто перечислить не получается? Получается, но требуется передавать до 15 переменных, в зависимости от процедуры. Очень не удобно получается во время отладки/развития.. 1. Мне показалось удобнее сложить все переменные в контейнер и передавать во все процедуры ссылку на этот объект. А уже каждая процедура будет работать с необходимыми для неё переменными контейнера. 2. Вот и возникает вопрос каким контейнером лучше воспользоваться в этом случае, с точки зрения скорости обращения к переменным, ну и корректности Pascal в целом… Заранее реверанс, Илья. |
volvo |
![]()
Сообщение
#8
|
Гость ![]() |
Под какими компилерами будет твоя программа компилироваться? (Кроме твоего "www.wld3.com", который очень странно обрабатывает стандартные конструкции языка...
![]() |
Nolik |
![]()
Сообщение
#9
|
Группа: Пользователи Сообщений: 6 Пол: Мужской Реальное имя: Илья Репутация: ![]() ![]() ![]() |
очень странно обрабатывает стандартные конструкции языка... ![]() Проверил еще раз. Оба способа передачи объекта в подпрограмму Код procedure Test( Cont :Container ) и Код procedure Test( var Cont :Container ) Работают одинаково... Код Type Container = class( TObject ) private protected public str :string; end; procedure Test( Cont :Container ); begin Cont.str:='Test'; end; var Cont :Container; Cont:=Container.Create; Print(Cont.str); Test(Cont); Print(Cont.str); Все-таки у меня остается не решенным вопрос: каким контейнером лучше воспользоваться в моем случае, с точки зрения скорости обращения к переменным, ну и корректности Pascal в целом… Илья. |
volvo |
![]()
Сообщение
#10
|
Гость ![]() |
Ага... Так у тебя все-таки 32-бита. Тогда ясно, Class передается по ссылке всегда. Я думал ты в 16 битном сидишь
![]() Я бы на твоем месте все-таки пересмотрел структуру программы... Процедура, принимающая 15 параметров... ![]() Ну, или просто объедини связанные между собой данные в Record (а может быть и в Object/Class, все зависит от того, что именно ты делаешь с этими данными, как именно они связаны с остальной программой, ... , и еще много причин) |
hardcase |
![]()
Сообщение
#11
|
![]() code warrior ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 484 Пол: Мужской Реальное имя: Славен Репутация: ![]() ![]() ![]() |
Все-таки у меня остается не решенным вопрос: каким контейнером лучше воспользоваться в моем случае, с точки зрения скорости обращения к переменным, ну и корректности Pascal в целом Как сказал Вольво зашей все данные в отдельный класс, а в нём определи методы - твои процедуры и функции. -------------------- ИзВ ин ИтЕ зА нЕ рОв НЫй П оч ЕРк
|
Nolik |
![]()
Сообщение
#12
|
Группа: Пользователи Сообщений: 6 Пол: Мужской Реальное имя: Илья Репутация: ![]() ![]() ![]() |
У меня программа состоит из ОДНОГО главного цикла, в котором находится длинный список подпрограмм:
Код FOR i:=0 to Max do begin Procedure1(); Procedure2(); ...... …… ProcedureN(); END; И даже работа с файлами производится из процедур. Таким образом, абсолютно ВСЕ переменные, определенные (и заданные) в начале кода, оказываются внешними по отношению к процедурам ![]() Вот и получается что варианта 2: 1. Позволить процедурам работать с внешними переменными: Все прозрачно + НЕ требуется выделение дополнительной оперативной памяти. Но возникает вопрос о корректности с точки зрения языка Pascal в целом. 2. Собрать мегазборку переменных Type=Record и передавать ее в процедуры. В этом случае с точки зрения Pascal все вроде как «тип-топ», но потребуется выделение дополнительной памяти, и возможно снизится общая скорость работы программы. Оба варианта работают одинаково, в том смысле что вычислительный результат совпадает. Во время процесса оптимизации стратегии, программа запускается несколько сот/тысяч раз в цикле, что требует оптимизации выделения памяти и сокращения общего времени работы программы. Поскольку вся наша жизнь есть сплошной компромисс, то вопрос к Гуру от Pascal такой: Какой вариант предпочесть??? Низкий поклон за помощь. Илья. Сообщение отредактировано: Nolik - 27.01.2006 6:53 |
Dark |
![]()
Сообщение
#13
|
![]() Знаток ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 408 Пол: Мужской Репутация: ![]() ![]() ![]() |
помоему - удобнее всего использовть record...
если я правильно понимаю задачу а потом передавать его адрес... Скорость я думаю не критично снизится =) удобства зато больше. -------------------- - Где я?
- Во тьме. - В какой тьме? - Во тьме твоего мозга. |
volvo |
![]()
Сообщение
#14
|
Гость ![]() |
Nolik,
Ты не хочешь читать предыдущие посты, а упорно гнешь свою линию (ведешь к тому, чтобы использовать глобальные переменные)? Так зачем спрашиваешь? Тебе сказали, как делать - объединяй данные в Class и создавай процедуры их обработки как методов класса... Если же у тебя будет программа, написанная НЕ по принципам ООП, и ты просто прикрутишь классы для того, чтобы передавать значения в процедуры - будет коряво. В-общем, прекращаем переливание из пустого в порожнее, если нужна конкретная помощь - присоединяй исходник, поможем оптимизировать. Если нет - тема закрыта... |
hardcase |
![]()
Сообщение
#15
|
![]() code warrior ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 484 Пол: Мужской Реальное имя: Славен Репутация: ![]() ![]() ![]() |
Оба варианта - разумные и удобные. Как а том анекдоте про программера - "Всё работает? - Да - Точно? - Да! - Ничего НЕ МЕНЯЙ!!"
-------------------- ИзВ ин ИтЕ зА нЕ рОв НЫй П оч ЕРк
|
Nolik |
![]()
Сообщение
#16
|
Группа: Пользователи Сообщений: 6 Пол: Мужской Реальное имя: Илья Репутация: ![]() ![]() ![]() |
Как а том анекдоте про программера - "Всё работает? - Да - Точно? - Да! - Ничего НЕ МЕНЯЙ!!" Хороший анекдот, я его по утрам частенько вспоминаю ![]() Всем активистам Гран Мерси за содействие, Пойду перекрою весь код... Илья. Сообщение отредактировано: Nolik - 27.01.2006 16:15 |
![]() ![]() |
![]() |
Текстовая версия | 21.07.2025 14:56 |