:: Visual Foxpro, Foxpro for DOS
Re: Добавление записи из grid в текстовое поле
akvvohinc

Сообщений: 4224
Откуда: Москва
Дата регистрации: 11.11.2008
of63
не проводил экспериментов, но уверен, как Пу, что в данном примере, обращении к полю курсора в текущей строке, что макрос и что EVAL дадут разницу времени выполнения в проценты, а не в разы

Все верно - использование макро примерно на 30% дольше.
Но ты бы хотел ждать отчет 4 часа вместо 3-х только потому, что у автора исходники получаются короче?

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



Исправлено 1 раз(а). Последнее : akvvohinc, 21.12.17 20:38
Ratings: 0 negative/0 positive
Re: Добавление записи из grid в текстовое поле
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Сергей, за 30% (процент с доверительным интервалом каким?), при наших временах (1 сут. иногда) не сильно важен. Важно получить адекватный результат, и чтобы при переделке програмер быстро починил, изменил, поэтому краткость текста проги (и хороший коммент, зачем именно так сделано) важнее кошерности текса.

Т.е. вопрос "Но ты бы хотел ждать отчет 4 часа вместо 3-х только потому, что у автора исходники получаются короче?" не полностью многомерен...



Исправлено 1 раз(а). Последнее : of63, 21.12.17 20:45
Ratings: 0 negative/0 positive
Re: Добавление записи из grid в текстовое поле
akvvohinc

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

Сам суди, чтобы дать тебе цифру не совсем с потолка, я убрал из цикла все лишнее:

CREATE CURSOR c1 (f1 i)
x = 'c1'
m.sec = SECONDS()
FOR m.i=1 TO 10^7
= &x..f1
ENDFOR
t1 = SECONDS()-m.sec
? t1
m.sec = SECONDS()
FOR m.i=1 TO 10^7
= EVALUATE(x+'.f1')
ENDFOR
t2 = SECONDS()-m.sec
?t2
? ROUND(t1*100/t2-100,1),'%'

У меня обычно результат получается в интервале 31..33 %



Исправлено 1 раз(а). Последнее : akvvohinc, 21.12.17 21:07
Ratings: 0 negative/0 positive
Re: Добавление записи из grid в текстовое поле
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Хорошо, твоя правда, примем за разницу в скоростях (в обращении к полю курсора ) "макро-EVAL" в 1/1.33, в пользу EVALUATE, согласен )

Доб. Попробуй поменять местами проверки макро-EVAL, интересно, влияет очередность применения, ну, буферизация винды и фокса всякие...

Доб2. Это не причем, читаем из буфера. тут вроде просто затраты фокса на интерпретацию макроса, или EVAL...



Исправлено 2 раз(а). Последнее : of63, 21.12.17 21:33
Ratings: 0 negative/0 positive
Re: Добавление записи из grid в текстовое поле
Ydin

Сообщений: 7648
Откуда: Киев
Дата регистрации: 16.12.2005
Если 0.001*1.33, то о чем говорим? Cмены кадра не увидим.
А реально, там и 0.001 с натяжкой.
Если сверху без оператора цикла...
Другое дело, автору нужно умножить на 10^7! Самое время поизголяться с Eval'ом.

Одно дело миллионеру отдавать 30% с дохода, другое - нищему, вообще, без дохода



Исправлено 5 раз(а). Последнее : Ydin, 27.12.17 16:23
Ratings: 0 negative/0 positive
Re: Добавление записи из grid в текстовое поле
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Нормальное сравнение, может и правда, что EVAL несколько (33%) быстрее чем макро...:

FOR m.i=1 TO 10^7
= &x..f1
ENDFOR
FOR m.i=1 TO 10^7
= EVALUATE(x+'.f1')
ENDFOR

Доб... Добавить "m." интересно что изменит?
= EVALUATE("m." + x+'.f1')



Исправлено 1 раз(а). Последнее : of63, 21.12.17 21:59
Ratings: 0 negative/0 positive
Re: Добавление записи из grid в текстовое поле
akvvohinc

Сообщений: 4224
Откуда: Москва
Дата регистрации: 11.11.2008
Ydin
Другое дело, автору нужно умножить на 10^7! Самое время поизголяться с Eval'ом.

Я сделал 10^7, чтобы точнее получить результат.

А в остальном - у нас у всех разные задачи случались в жизни.
У нас были расчеты, которые даже на первых пентиумах считались до 8 часов, поэтому "бороться за время" для меня давняя привычка.

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



Исправлено 1 раз(а). Последнее : akvvohinc, 21.12.17 22:02
Ratings: 0 negative/0 positive
Re: Добавление записи из grid в текстовое поле
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
() Вопрос не по теме. До каких максимальных времен выполнения расчетов вы поднимались? )
Ratings: 0 negative/0 positive
Re: Добавление записи из grid в текстовое поле
akvvohinc

Сообщений: 4224
Откуда: Москва
Дата регистрации: 11.11.2008
Я уже точно не помню, но примерно те же расчеты еще на 286-х считались, бывало, около суток (в зависимости от объемов данных, конечно). Тема - ЖКХ.
Ratings: 0 negative/0 positive
Re: Добавление записи из grid в текстовое поле
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
У нас нормально, ок 1 сек на человека, начислить (пересчитать ИД), налогообложить (это значит прочитать всю его историю, и выплаты, и ИД посмотреть, и вычеты), то так и выходит... много часов

Я клоню, что фокс ведь на одном ядре процессора крутится. Ядро достигло физического максимума скорости - 2 ГГц... Интересно, кто как борется за повышение скорости обработки данных "на порядок". Поэтому и возник спор у нас, "что быстрее"... Но 30% детали - это несущественно.



Исправлено 2 раз(а). Последнее : of63, 21.12.17 22:16
Ratings: 0 negative/0 positive
Re: Добавление записи из grid в текстовое поле
akvvohinc

Сообщений: 4224
Откуда: Москва
Дата регистрации: 11.11.2008
of63
Добавить "m." интересно что изменит?

Когда-то я проводил подобные эксперименты.
И если правильно помню, то добавка "m." увеличивает время исполнения, но вот на сколько - не помню.
Видимо, не существенно, раз я этой добавкой пользуюсь.

--------
Сейчас проверил - разницы не заметил. Какой вариант ставишь первым, тот проигрывает с разницей менее 1%.



Исправлено 1 раз(а). Последнее : akvvohinc, 21.12.17 22:19
Ratings: 0 negative/0 positive
Re: Добавление записи из grid в текстовое поле
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Вобщем, Сергей, хорошо поспорили ни о чем
Ratings: 0 negative/0 positive
Re: Добавление записи из grid в текстовое поле
leonid

Сообщений: 3204
Откуда: Рига
Дата регистрации: 03.02.2006
akvvohinc
of63
Сергей, за 30% (процент с доверительным интервалом каким?)

Сам суди, чтобы дать тебе цифру не совсем с потолка, я убрал из цикла все лишнее:

CREATE CURSOR c1 (f1 i)
x = 'c1'
m.sec = SECONDS()
FOR m.i=1 TO 10^7
= &x..f1
ENDFOR
t1 = SECONDS()-m.sec
? t1
m.sec = SECONDS()
FOR m.i=1 TO 10^7
= EVALUATE(x+'.f1')
ENDFOR
t2 = SECONDS()-m.sec
?t2
? ROUND(t1*100/t2-100,1),'%'

У меня обычно результат получается в интервале 31..33 %

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

CREATE CURSOR c1 (f1 i)
x = 'c1'
z = 'OR'
m.sec = SECONDS()
FOR m.i=1 TO 10^5
= &x..f1
ENDF&z
t1 = SECONDS()-m.sec
? t1
m.sec = SECONDS()
FOR m.i=1 TO 10^5
= EVALUATE(x+'.f1')
ENDFOR
t2 = SECONDS()-m.sec
?t2
? ROUND(t1*100/t2-100,1),'%'

P.S. Кстати, если закоментировать строчки внутри обеих циклов, можно примерно узнать, во сколько раз замедляет макро на самом деле.



Исправлено 1 раз(а). Последнее : leonid, 21.12.17 22:22
Ratings: 0 negative/0 positive
Re: Добавление записи из grid в текстовое поле
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Леонид, не понял в чем тонкость:
FOR m.i=1 TO 10^5
= &x..f1
ENDF&z

FOR m.i=1 TO 10^5
= EVALUATE(x+'.f1')
ENDFOR

Я убрал измерители времени, и количество оборотов FOR...
Вы ловите "фишки" фокса м.б. всего лишь? (детали выполнения команды & и EVAL)

...И что это такое
FOR m.i=1 TO 10^5
= &x..f1
ENDF&z



Исправлено 1 раз(а). Последнее : of63, 21.12.17 22:24
Ratings: 0 negative/0 positive
Re: Добавление записи из grid в текстовое поле
leonid

Сообщений: 3204
Откуда: Рига
Дата регистрации: 03.02.2006
Замечанием в P.S. я хотел подчеркнуть, что на самом деле команда, в которой есть макрос, может выполняться в 10 - 15 раз медленнее, чем аналогична команда без макроса. Меньшая разница у akvvohinc получилась потому, что в его коде есть и другие команды, без макросов.
Ratings: 0 negative/0 positive
Re: Добавление записи из grid в текстовое поле
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Это я понял! Приведи пример, когда макрос (&) выполняется на ПОРЯДОК дольше чем EVAL, тогда поверю, что EVAL - это что-то принципиально другое в фоксе, чем & (в рантайме в т.ч.)
Ratings: 0 negative/0 positive
Re: Добавление записи из grid в текстовое поле
Taran

Сообщений: 13625
Откуда: Красноярск
Дата регистрации: 16.01.2008
А ежели пойти классическим путем, то и макро и евал остаются позади конкретно
FOR m.i=1 TO 10^7
s = Select()
Select (m.x)
= f1
Select (m.s)
ENDFOR

ну и ежели по возможности вынести SELECT за FOR...ENDFOR, то вообще ахтунг
s=Select()
Select (m.x)
FOR m.i=1 TO 10^7
= f1
ENDFOR
Select (m.s)
Ratings: 0 negative/0 positive
Re: Добавление записи из grid в текстовое поле
leonid

Сообщений: 3204
Откуда: Рига
Дата регистрации: 03.02.2006
of63
Приведи пример, когда макрос (&) выполняется на ПОРЯДОК дольше чем EVAL

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

CREATE CURSOR c1 (f1 i)
x = "''"
z = 'OR'
m.sec = SECONDS()
FOR m.i=1 TO 10^5
= &x
ENDF&z
t1 = SECONDS()-m.sec
? t1
m.sec = SECONDS()
FOR m.i=1 TO 10^5
= EVALUATE(x)
ENDFOR
t2 = SECONDS()-m.sec
?t2
? ROUND(t1*100/t2-100,1),'%'
Ratings: 0 negative/0 positive
Re: Добавление записи из grid в текстовое поле
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
хм... наблюдаю разные картины при ЭЛЕМЕНТАРНЫХ изменениях:
CREATE CURSOR c1 (f1 i)
x = "''"
z = 'OR'

*!* LOCAL m.sec
*!* m.sec = SECONDS()

FOR m.i=1 TO 10^5
= &x
ENDF&z

t1 = SECONDS()-m.sec
? t1

m.sec = SECONDS()

FOR m.i=1 TO 10^5
= EVALUATE(x)
ENDFOR

t2 = SECONDS()-m.sec
?t2

? ROUND(t1*100/t2-100,1),'%'

ТАМ ВВЕРХУ ЗАРЕМАРИЛ/ОТРЕМАРИЛ - и все меняется на в полраза! Вы там как эксперименты ставите, по первому отсчету делаете доклад?!



Исправлено 1 раз(а). Последнее : of63, 21.12.17 23:12
Ratings: 0 negative/0 positive
Re: Добавление записи из grid в текстовое поле
leonid

Сообщений: 3204
Откуда: Рига
Дата регистрации: 03.02.2006
of63
хм... наблюдаю разные картины при ЭЛЕМЕНТАРНЫХ изменениях:
CREATE CURSOR c1 (f1 i)
x = "''"
z = 'OR'

*!* LOCAL m.sec
*!* m.sec = SECONDS()

FOR m.i=1 TO 10^5
= &x
ENDF&z

t1 = SECONDS()-m.sec
? t1

m.sec = SECONDS()

FOR m.i=1 TO 10^5
= EVALUATE(x)
ENDFOR

t2 = SECONDS()-m.sec
?t2

? ROUND(t1*100/t2-100,1),'%'

ТАМ ВВЕРХУ ЗАРЕМАРИЛ/ОТРЕМАРИЛ - и все меняется на в полраза! Вы там как эксперименты ставите, по первому отсчету делаете доклад?!

Запустил Ваш код, и действительно все изменилось, только не в полтора раза, а значительно кардинальней.
Ratings: 0 negative/0 positive


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

On-line: 39 (Гостей: 39)

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