:: Visual Foxpro, Foxpro for DOS
Re: нужно объяснение
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
() почему все так не любят макро, точнее, называют макро "никогда не было особенно хорошим"? Мтк, макрос (динамически создаваемый код программы) - вполне жизнеспособная парадигма программирования, как и вынесение части констант кода в внешние параметры, или выполнение какого-то файла метаданных их исполнителем, компилятором метаданных в код "на-лету"... Что не так?

Если единственный аргумент типа "это не понятно", или "это долго компилируется", то в некоторых задачах (не требующих "машинного" кодирования для скоростного исполнения) вполне себе удобно, и не всегда непонятно...
Ratings: 0 negative/0 positive
Re: нужно объяснение
Ydin

Сообщений: 7648
Откуда: Киев
Дата регистрации: 16.12.2005
of63
почему все так не любят макро
Не все! Когда хочется мало писать и это для себя на тот момент ...
Джазовая штучка



Исправлено 1 раз(а). Последнее : Ydin, 06.10.21 21:05
Ratings: 0 negative/0 positive
Re: нужно объяснение
akvvohinc
Автор

Сообщений: 4224
Откуда: Москва
Дата регистрации: 11.11.2008
Цитата:
Если единственный аргумент типа "это не понятно", или "это долго компилируется", то в некоторых задачах (не требующих "машинного" кодирования для скоростного исполнения) вполне себе удобно, и не всегда непонятно

В основном рассуждают иначе - макро ничем не лучше других способов, если их можно использовать наряду с макро, но при этом макро "тормозит".
Вывод - зачем в этих случаях использовать макро?

А вот против использования макро в тех случаях, когда других способов нет, или они значительно усложняют реализацию (понимание) того же самого, вряд ли кто будет возражать.

Я чаще всего использую макро в тех случаях, когда это ускоряет выполнение программы, такие случаи тоже не редкость.



Исправлено 1 раз(а). Последнее : akvvohinc, 06.10.21 22:06
Ratings: 0 negative/0 positive
Re: нужно объяснение
Ydin

Сообщений: 7648
Откуда: Киев
Дата регистрации: 16.12.2005
А вот против использования макро в тех случаях, когда других способов нет, или они значительно усложняют реализацию (понимание) того же самого, вряд ли кто будет возражать.
Тяжелая фраза. Макро понятнее
Ratings: 0 negative/0 positive
Re: нужно объяснение
Taran

Сообщений: 13625
Откуда: Красноярск
Дата регистрации: 16.01.2008
akvvohinc
Я чаще всего использую макро в тех случаях, когда это ускоряет выполнение программы, такие случаи тоже не редкость.

Интересно бы хоть один пример увидеть.
А иначе это просто треп.
Ratings: 0 negative/0 positive
Re: нужно объяснение
akvvohinc
Автор

Сообщений: 4224
Откуда: Москва
Дата регистрации: 11.11.2008
Taran
Интересно бы хоть один пример увидеть.

Любая команда типа "цикл" (SCAN FOR, REPLACE FOR и т.п.) с "динамически формируемым" условием, включающим выражение над полями таблицы и т.п.

В общем, это те случаи, когда предстоит выбрать между макро и EVAL()

Естественно, результат будет зависеть от количества обрабатываемых записей и сложности выражения FOR (количества вызовов EVAL() в FOR).
CLEAR
CLOSE ALL
CREATE CURSOR table1 (field1 C(10))
FOR i=1 TO 11^7
INSERT INTO table1 VALUES (SYS(2015))
ENDFOR
fieldname = 'field1'
sec = SECONDS()
REPLACE &fieldname WITH '' FOR &fieldname='1'
? TRANSFORM(SECONDS()-sec,'c макро - 99.9 сек.')
sec = SECONDS()
REPLACE (fieldname) WITH '' FOR EVALUATE(fieldname)='1'
? TRANSFORM(SECONDS()-sec,'без макро - 99.9 сек.')

Taran
А иначе это просто треп.

Тоже хотел бы, чтобы ты привел хоть один пример моего трёпа.



Исправлено 5 раз(а). Последнее : akvvohinc, 07.10.21 12:18
Ratings: 0 negative/0 positive
Re: нужно объяснение
danton1973

Сообщений: 143
Откуда: Пермь
Дата регистрации: 10.08.2020
а так:
_vfp.DoCMD("REPLACE "+m.fieldname+" WITH '' FOR "+m.fieldname+"=='1'")
Ratings: 0 negative/0 positive
Re: нужно объяснение
akvvohinc
Автор

Сообщений: 4224
Откуда: Москва
Дата регистрации: 11.11.2008
danton1973
_vfp.DoCMD("REPLACE "+m.fieldname+" WITH '' FOR "+m.fieldname+"=='1'")

1) это та же макроподстановка (отложенная компиляция), есть еще EXECSCRIPT() из той же серии;
command = "REPLACE "+m.fieldname+" WITH '' FOR "+m.fieldname+"=='1'"
&command
2) такой конструкцией не заменишь, например, команду SCAN FOR.



Исправлено 3 раз(а). Последнее : akvvohinc, 07.10.21 12:11
Ratings: 0 negative/0 positive
Re: нужно объяснение
Ydin

Сообщений: 7648
Откуда: Киев
Дата регистрации: 16.12.2005
макроподстановка сегодня тормозит так мало, что можно не обращать внимания!
И не спорить тут.
Кому как удобно!
Я пишу (программирую) так, как мне хочется. Чтоб быстрее написать и получить результат.
Если надо потом по времени выполнения ускорить, может, и макро заменю.
Там, где явно это! В большом цикле, скане... По ситуации.
Посмотрите на часы - вторая половина 2021 года.
Уже тех EC1018, Правецов, XT, AT нет! А если у Вас есть еще, то боритесь с макро.
Но тут мы должны разделиться...



Исправлено 2 раз(а). Последнее : Ydin, 07.10.21 20:54
Ratings: 0 negative/0 positive
Re: нужно объяснение
Владимир Максимов

Сообщений: 14100
Откуда: Москва
Дата регистрации: 02.09.2000
of63
() почему все так не любят макро, точнее, называют макро "никогда не было особенно хорошим"? Мтк, макрос (динамически создаваемый код программы) - вполне жизнеспособная парадигма программирования, как и вынесение части констант кода в внешние параметры, или выполнение какого-то файла метаданных их исполнителем, компилятором метаданных в код "на-лету"... Что не так?

Если единственный аргумент типа "это не понятно", или "это долго компилируется", то в некоторых задачах (не требующих "машинного" кодирования для скоростного исполнения) вполне себе удобно, и не всегда непонятно...


99% времени программист тратит вовсе не написание нового, а на попытку понять уже написанное и как-то вписаться со своими изменениями. И вот здесь макро - это крайне не удобно. Требует дополнительного времени на понимание. Иногда - очень существенного.

Вот только не надо сразу возражать, мол "мне все понятно". В том-то и дело. Здесь ключевое слово "мне". Причем, еще стоит добавить "сейчас". В смысле, пока ты именно этой задачей занимаешься. Спустя пару месяцев, если переключился на другую задачу, сам же будешь смотреть на этот макро как баран на новые ворота

Чтобы было понятно, приведу простой пример. На своем компьютере ты знаешь в какой папке какой файл лежит. "Здесь и сейчас" тебе "все понятно". А если тебя попросить найти файл, содержащий определенный текст на чужом компьютере? Быстро получится? Даже если поисковик включишь...
Ratings: 0 negative/0 positive
Re: нужно объяснение
Владимир Максимов

Сообщений: 14100
Откуда: Москва
Дата регистрации: 02.09.2000
akvvohinc
Я чаще всего использую макро в тех случаях, когда это ускоряет выполнение программы, такие случаи тоже не редкость.

Это невозможно. Макро не способен ускорить выполнение программы. Макро - это способ уменьшить количество знаков в коде. Т.е. это способ ускорить написание программы.

Но! Повторюсь, 99% времени программист тратит вовсе не на первичное написание кода, а на его чтение и внесение изменений. Поэтому когда гонятся именно за ускорением первичного написания, как правило, это приводит к обратному эффекту. И время и объем кода начинает катастрофически расти.


PS:

REPLACE &fieldname WITH '' FOR &fieldname='1'
REPLACE (fieldname) WITH '' FOR EVALUATE(fieldname)='1'

Если речь об этом, то это не корректное использование терминов. И Evaluate() и выражение имени - это тоже "макроподстановка". Только менее универсальная. Специализированная.

В данном случае вторая команда, конечно, будет медленнее по той причине, что при использовании символа макроподстановки & формируется вся строка целиком, а не ее фрагмент. Причем только и исключительно из-за evaluate(). Выражение имени как раз наоборот, работает несколько быстрее, чем &


Но когда говорят, что "макро работает быстрее", то я понимаю это так, что сравнение идет с прямой командой

REPLACE field1 WITH '' FOR field1='1'

И вот здесь никакого выигрыша в скорости быть не может

А вообще, согласен вот с этим

Ydin
макроподстановка сегодня тормозит так мало, что можно не обращать внимания!
И не спорить тут.
Кому как удобно!

Вовсе не в скорости дело-то...



Исправлено 1 раз(а). Последнее : Владимир Максимов, 07.10.21 21:25
Ratings: 0 negative/0 positive
Re: нужно объяснение
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
В скорости тоже, но это не самая частая проблема. Хотя, если кто-то ставит макро чуть ли не в каждую вторую команду - то очевидно и со скоростью у него будут проблемы.

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

Конечно же запрещать макро никто не будет, да и на "глупое" его использование (например там где вполне можно обойтись выражением имени) вряд ли будут делать большой акцент...

Владимир Максимов
Но когда говорят, что "макро работает быстрее", то я понимаю это так, что сравнение идет с прямой командой
Нет, конечно. Сравнение с альтернативными способами написания динамического кода. Сравнивать со статическим кодом совершенно бессмысленно - т.к. если кто-то использует макро для написания статического кода, то это выглядит очень, очень странно - вероятно он преследует цель сделать код нечитаемым, неотлаживаемым или закладывает какую-то тайм-бомбу

Владимир Максимов
И Evaluate() и выражение имени - это тоже "макроподстановка"
Я бы не стал делать таких обобщений. Эти команды/опции могут использоваться для написания динамического кода, но это не делает из них "макроподстановку". Так то можно и execscript или собственно компиляцию в рантайме вспомнить - но не "макроподстановкой", конечно же, называть это.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: нужно объяснение
akvvohinc
Автор

Сообщений: 4224
Откуда: Москва
Дата регистрации: 11.11.2008
Владимир Максимов
Это невозможно. Макро не способен ускорить выполнение программы.

Приведенный мною пример показывает, что макро ускорило выполнение команды по сравнению с возможной альтернативой, несмотря на "невозможность" этого.

Но если вы можете реализовать то же, но без макро, и чтобы работало быстрее, чем с макро, то приведите пример - мне придется согласиться, что макро не ускорило выполнение этой задачи.

А до тех пор получается, что вы отрицаете очевидное.

Владимир Максимов
Макро - это способ уменьшить количество знаков в коде.

Допускаю, что какое-то количество людей использует макро только с такой целью.

Во всяком случае, я использую макро в основном для достижения двух целей:
1) ускорить выполнение программы (пример выше);
2) построить команду в Run-time для последующей компиляции и выполнения, если это недостижимо другими способами.

Не припомню случая (хотя возможно, и были такие), когда бы я использовал макро для уменьшения количества знаков в коде.
В этих случаях пользуются #DEFINE. Ведь макро обычно замедляет работу.

Владимир Максимов
это не корректное использование терминов. И Evaluate() и выражение имени - это тоже "макроподстановка".

Сравнение макроподстановки с другими способами достижения "динамики" обычно, да и в этой теме, проводится по критерию скорости выполнения кода.

"Настоящее" макро "тормозит" из-за того, что команда должна быть предварительно откомпилирована.
И поэтому я вполне корректно сравниваю ее с вариантом с EVAL(), который обычно выполняется быстрее (ведь такая команда уже откомпилирована). Обычно, но не в указанных мною выше случаях.

Владимир Максимов
Но когда говорят, что "макро работает быстрее", то я понимаю это так, что сравнение идет с прямой командой
Сравнивать с "прямой командой", конечно, тоже можно, но неинтересно, так как здесь и так всё понятно.

Но вы не всегда можете заменить макро "прямой командой", а в этих случаях тоже можно выбрать более быстрый вариант, то есть сравнить макро с другими способами достижения цели.

И если вы ещё раз вернётесь к написанному мною выше:
akvvohinc
Я чаще всего использую макро в тех случаях, когда это ускоряет выполнение программы, такие случаи тоже не редкость.
то согласитесь, что я ничего не писал о том, с каким способом я сравнивал макро.
Напишите аналог с использованием "прямой команды", получите более быстрый результат - я скажу "Спасибо большое!" и далее буду пользоваться вашим способом вместо макро.

Владимир Максимов
В данном случае вторая команда, конечно, будет медленнее по той причине, что при использовании символа макроподстановки & формируется вся строка целиком, а не ее фрагмент. Причем только и исключительно из-за evaluate().

"Фрагменты" тут ни при чём.
И если бы здесь не было "цикла", то не только ваш "вывод", но и само заключение о скорости выполнения этих вариантов было бы ошибочным.

Макро работает здесь быстрее по той причине, что сначала команда один раз компилируется (это потери времени), но затем миллионы раз исполняется как "прямая команда".
При выполнении команды с EVAL() время на компиляцию не тратится, но затем миллионы раз отрабатывает EVAL(), а это дольше, чем получение значения поля "напрямую".

Владимир Максимов
Выражение имени как раз наоборот, работает несколько быстрее, чем &
Да, если речь идет о разовом исполнении команды, так как временнЫе потери на компиляцию не успевают компенсироваться более быстрым выполнением "прямой команды", получившейся после макроподстановки.

Но если речь идет о цикле, то макроподстановка может сработать быстрее, так как многократное исполнение "прямой команды" способно компенсировать время, потраченное на её компиляцию.

Ydin
макроподстановка сегодня тормозит так мало, что можно не обращать внимания!

Если два заказчика предлагают вам договор на одно и то же задание - один за $1000, а другой - за $1005, и вы можете заключить его лишь с одним из них, то вы выберете первого, я правильно понимаю?



Исправлено 10 раз(а). Последнее : akvvohinc, 08.10.21 02:12
Ratings: 0 negative/0 positive
Re: нужно объяснение
danton1973

Сообщений: 143
Откуда: Пермь
Дата регистрации: 10.08.2020
akvvohinc
danton1973
_vfp.DoCMD("REPLACE "+m.fieldname+" WITH '' FOR "+m.fieldname+"=='1'")

1) это та же макроподстановка (отложенная компиляция), есть еще EXECSCRIPT() из той же серии;
command = "REPLACE "+m.fieldname+" WITH '' FOR "+m.fieldname+"=='1'"
&command
2) такой конструкцией не заменишь, например, команду SCAN FOR.

Я в этом случае использую SET FILTER TO + SCAN. Причём SET FILTER тоже можно собрать через _vfp.DoCMD. По моим замерам работает быстрее, чем SCAN FOR с макроподстановками....
Ratings: 0 negative/0 positive
Re: нужно объяснение
Владимир Максимов

Сообщений: 14100
Откуда: Москва
Дата регистрации: 02.09.2000
akvvohinc

Это забавно, когда сам себе придумываешь неправильные ответ, а потом героически бросаешься его опровергать. Вы вообще заметили, что начали отвечать на одно, а потом оказалось, что речь о другом?

akvvohinc
Если два заказчика предлагают вам договор на одно и то же задание - один за $1000, а другой - за $1005, и вы можете заключить его лишь с одним из них, то вы выберете первого, я правильно понимаю?

А вот это правильный вопрос. Только на практике, это означает, что в данном случае цена перестает быть критерием выбора. И в этом случае при принятии решения начинают учитывать другие критерии. Ну, там, надежность заказчика в плане оплаты, вменяемые сроки реакции при уточнении постановки, знакомства и т.д. и т.п.

Я правильно понимаю, что Вы в этой ситуации выберите второго не глядя на все остальные условия? ;)

Честно не понимаю, что Вы так уперлись в скорость работы макро? Ситуации, когда это критически важно скорее исключение. И говорит прежде всего о том, что само приложение как-то не правильно организовано. Приходится "костыль" ставить.
Ratings: 0 negative/0 positive
Re: нужно объяснение
akvvohinc
Автор

Сообщений: 4224
Откуда: Москва
Дата регистрации: 11.11.2008
Цитата:
Вы вообще заметили, что начали отвечать на одно, а потом оказалось, что речь о другом?

Нет, не заметил.

Цитата:
Я правильно понимаю, что Вы в этой ситуации выберите второго не глядя на все остальные условия?

Условия этой задачи определяю я, а поэтому сообщаю дополнительно - все остальные условия равны.

danton1973
Я в этом случае использую SET FILTER TO + SCAN. Причём SET FILTER тоже можно собрать через _vfp.DoCMD. По моим замерам работает быстрее, чем SCAN FOR с макроподстановками....

На мой взгляд, это бессмысленно - и суть, и результат должны быть одинаковыми.

Но если вы готовы доказать, что фильтр, установленный до команды SCAN, и тот же фильтр, установленный в самой команде, работают с разной скоростью (я этого никогда не проверял, считая невозможным), то пожалуйста - пример в студию.

И вообще непонятно, зачем явно устанавливать, а затем явно снимать фильтр, если можно этого не делать.
Если только ради того, чтобы не использовать макро, то вы ошибаетесь - _vfp.DoCMD - это то же макро, ничем не отличающееся от обычной макроподстановки - команда компилируется "на лету".



Исправлено 4 раз(а). Последнее : akvvohinc, 08.10.21 13:37
Ratings: 0 negative/0 positive
Re: нужно объяснение
akvvohinc
Автор

Сообщений: 4224
Откуда: Москва
Дата регистрации: 11.11.2008
Владимир Максимов
Честно не понимаю, что Вы так уперлись в скорость работы макро?

Я тоже не понимаю, в каком месте этого топика я во что-то упёрся.
Мне казалось, что я просто сообщил некоторые факты о работе макро с примерами, которые, возможно, будут кому-то интересны.

А когда вы голословно попытались их опровергнуть ("Это невозможно."), предложил вам сделать это не на словах.
Вместо этого вы спрашиваете, зачем я привел пример, касающийся скорости работы макро.
Ratings: 0 negative/0 positive
Re: нужно объяснение
Владимир Максимов

Сообщений: 14100
Откуда: Москва
Дата регистрации: 02.09.2000
akvvohinc
Цитата:
Вы вообще заметили, что начали отвечать на одно, а потом оказалось, что речь о другом?

Нет, не заметил.

Владимир Максимов
Но когда говорят, что "макро работает быстрее", то я понимаю это так, что сравнение идет с прямой командой

А Вы о чем?

akvvohinc
Цитата:
Я правильно понимаю, что Вы в этой ситуации выберите второго не глядя на все остальные условия?

Условия этой задачи определяю я, а поэтому сообщаю дополнительно - все остальные условия равны.

"Сферический конь в вакууме"? Ново... Свежо... Оригинально...
Ratings: 0 negative/0 positive
Re: нужно объяснение
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
> Вот только не надо сразу возражать, мол "мне все понятно". В том-то и дело. Здесь ключевое слово "мне". Причем, еще стоит добавить "сейчас". В смысле, пока ты именно этой задачей занимаешься. Спустя пару месяцев, если переключился на другую задачу, сам же будешь смотреть на этот макро как баран на новые ворота

Владимир, я это и имел ввиду, что парадигма "макро" непростая (как при чтении книги - апостроф вверху заставляет нас сделать в уме подстановку лирического отступления автора в этой точке текста. Это не каждый способен сделать, тем более в уме ), но и не сложная. Но люди заворачивают более тонкие (...как они их сейчас называют... "сахарок" что-ли?) и более сложные синтаксические конструкции в своем си, например...

Поэтому, аппелировать к тому, что "сам же не поймешь потом" - это не повод этим не заниматься. Да, все сложно стало. Даже налево не повернешь без "если", и "как бы не", и "надо знать ПДД"... Да, надо знать и в уме подставлять после амперсанда тексты... вроде уже можно говорить, что это ПРОСТО... )
Ratings: 0 negative/0 positive
Re: нужно объяснение
akvvohinc
Автор

Сообщений: 4224
Откуда: Москва
Дата регистрации: 11.11.2008
Владимир Максимов
Но когда говорят, что "макро работает быстрее", то я понимаю это так, что сравнение идет с прямой командой.
А Вы о чем?

Вам уже двое ответили на этот вопрос - достаточно было просто прочитать.
Если этого мало, то сами привлеките "независимых экспертов".

Igor Korolyov
Нет, конечно. Сравнение с альтернативными способами написания динамического кода.
akvvohinc
Приведенный мною пример показывает, что макро ускорило выполнение команды по сравнению с возможной альтернативой, несмотря на "невозможность" этого.
Но если вы можете реализовать то же, но без макро, и чтобы работало быстрее, чем с макро, то приведите пример - мне придется согласиться, что макро не ускорило выполнение этой задачи.

А до тех пор получается, что вы отрицаете очевидное.

Владимир Максимов
Спустя пару месяцев, если переключился на другую задачу, сам же будешь смотреть на этот макро как баран на новые ворота.

Теперь понимаю, о чем вы.
Ведь со времени этих ответов и двух недель не прошло.



Исправлено 1 раз(а). Последнее : akvvohinc, 20.10.21 17:06
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 23 alex;  (Гостей: 22)

© 2000-2024 Fox Club 
Яндекс.Метрика