powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / переменные пропущенные в команде New
25 сообщений из 25, страница 1 из 1
переменные пропущенные в команде New
    #34629157
Фотография u78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У кого нибудь есть утилита для поиска сабжа?
Лично часто забываю "ньючить" переменные. Кто то автоматизировал процесс поиска таких "забытых" переменных?
...
Рейтинг: 0 / 0
переменные пропущенные в команде New
    #34629283
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Небыло надобности... :)
----------
Cache for Windows NT (Intel) 5.0.20 (Build 6305) Fri Sep 16 2005 11:54:10 EDT
...
Рейтинг: 0 / 0
переменные пропущенные в команде New
    #34629450
VadimF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почитайте про procedure block


Если Вы используете procedure block, то в методах классов не нужно делать New переменных и их потом Kill. Cache' это делает сама!

Вадим
...
Рейтинг: 0 / 0
переменные пропущенные в команде New
    #34629859
м-шестерка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
VadimF Почитайте про procedure block


Если Вы используете procedure block, то в методах классов не нужно делать New переменных и их потом Kill. Cache' это делает сама!

Вадим

Naming Conventions
A process-private global name takes one of the following forms:
^||name
^|"^"|name
^["^"]name
^["^",""]name
These four prefix forms are equivalent, and all four refer to the same process-private global. The first form (^||name) is the most common, and the one recommended for new code. The second, third, and fourth forms are provided for compatibility with existing code that defines globals. They allow you to specify a variable that determines whether to define name as a process-private global or a standard global. This is shown in the following example:
SET x=1 // toggle storage type
IF x=1 {
SET a="^" // for a process-private global
}
ELSE {
SET a="" // for a standard global
}
SET ^|a|name="a value"

Господа программисты
Помогите пожалуйста понять как пример соотносится с определением

^||name - это приватная глобаль или стандарная ?

Спасибо !
================
...
Рейтинг: 0 / 0
переменные пропущенные в команде New
    #34629896
Сашок
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
^||name - приватная глобаль
^name (или ^|""|name) - обычная.
В приведенном примере если x'=1, будет выполнен set в ^|""|name - это не то же самое, что ^||name.
...
Рейтинг: 0 / 0
переменные пропущенные в команде New
    #34630497
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Когда не было procedureblock(в каше 4) или когда его нельзя применять, делали запуск программы из терминала и смотрели, что из переменных от нее осталось.
...
Рейтинг: 0 / 0
переменные пропущенные в команде New
    #34630928
Сашок
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
С помощью ZBreak можно установить условный breakpoint при изменении значения переменной - помогает в поиске изменения пропущенной в new переменной. В отладчике Serenji также есть такая возможность, и конечно, в нем удобнее работать чем в отладчике в командной строке.
...
Рейтинг: 0 / 0
переменные пропущенные в команде New
    #34640024
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, что мешает использовать синтаксис ?
Код: plaintext
new (excludeVar1,excludeVar2)
...
Рейтинг: 0 / 0
переменные пропущенные в команде New
    #34641636
Sergei Obrastsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блок А.Н.Кстати, что мешает использовать синтаксис ?
Код: plaintext
new (excludeVar1,excludeVar2)

Ну да, очень интересное предложение. Мало там своих внутренних New, да еще и в Xecute.
А потом удивляемся на глючные, жрущие память и тормозящие программы.
...
Рейтинг: 0 / 0
переменные пропущенные в команде New
    #34642669
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот насчет глючные - это как раз если вы забудете с списке new перечислить нужную переменную

Вы расход памяти будете уменьшать повторным использованием переменных? Да, программисты M и вправду суровы

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

кстати есть данные по затратам времени на new?
...
Рейтинг: 0 / 0
переменные пропущенные в команде New
    #34642693
Sergei Obrastsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блок А.Н.Вот насчет глючные - это как раз если вы забудете с списке new перечислить нужную переменную

Вот как раз это мне делать ни к чему. Я не гоняю по кругу одни и те же имена.

Блок А.Н.
Вы расход памяти будете уменьшать повторным использованием переменных? Да, программисты M и вправду суровы

Можно подумать, что мы говорим о Васике. Нет, я просто оптимально их планирую.

Блок А.Н.
А затыка по скорости по моим наблюдениям в каше все-таки при работе с диском.

"Затыка по скорости" в каше при работе с последовательным файлом. С БД она работает не хуже других. А что обращение к памяти быстрее обращения к диску - это известно слишком давно.

Блок А.Н.
А если там в локальной памяти болтаются мегабайты локальных переменных, то не лучше ли их поместить во временный глобал?

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

Блок А.Н.
кстати есть данные по затратам времени на new?
Их не трудно прикинуть. Особенно на NEW () и полный NEW, которые тащат за собой копирование
таблицы локальных переменных и ее последующее восстановление. Особенно замечательно это
выглядит с большими локальными массивами или большим количеством переменных.
...
Рейтинг: 0 / 0
переменные пропущенные в команде New
    #34642721
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторВот как раз это мне делать ни к чему. Я не гоняю по кругу одни и те же имена.
Это как?! 8-|
У вас переменные называются SpecialVarIForRoutine1,SpecialVarSumForRoutine2?

я например видел, что из-за описки в написании имени переменной в списке new переменная перетирала переменную на два вызова выше.

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

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

авторИх не трудно прикинуть.
их не так трудно и посчитать

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
testnew
 k
 f i= 1 : 1 : 10000  x ("s x"_i_"="_i)
 f i= 1 : 1 : 10000  d n1(),n2(),n3()
n1()
{
 s a= 100 + 200 	
}
n2()
 n
 s a= 100 + 200 	
 q
n3()
 n a
 s a= 100 + 200 	
 q
 

Результаты %SYS.MONLBL
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
Line    RtnLine       Time  TotalTime
 1               1     0 . 000008     0 . 000008  testnew  ; Compiled July  6 ,  2007   10 : 52 : 57 
 2               1     0 . 004245     0 . 004245   k
 3               1     0 . 059813     0 . 059813   f i= 1 : 1 : 10000  x ("s x"_i_"="_i)
 4               1     0 . 118419     0 . 474902   f i= 1 : 1 : 10000  d n1(),n2(),n3()
 5           10000     0 . 021579     0 . 021579  n1()
 6               0     0            0         {
 7           10000     0 . 022499     0 . 022499   s a= 100 + 200 
 8           10000     0 . 021682     0 . 021682  }
 9           10000     0 . 021402     0 . 021402  n2()
 10          10000     0 . 052238     0 . 052238   n
 11          10000     0 . 023503     0 . 023503   s a= 100 + 200 
 12          10000     0 . 043850     0 . 043850   q
 13          10000     0 . 021497     0 . 021497  n3()
 14          10000     0 . 021639     0 . 021639   n a
 15          10000     0 . 022036     0 . 022036   s a= 100 + 200 
 16          10000     0 . 023322     0 . 023322   q
Total     110004     0 . 477732 
 

использование безагрументного new в контексте 10000 переменных в два раза медленнее, чем для одной переменной. Ужос! Вот из-за чего оказывается все тормозит

Cache for Windows (Intel) 5.2 (Build 329) Thu Jun 15 2006 16:40:08 EDT
...
Рейтинг: 0 / 0
переменные пропущенные в команде New
    #34642731
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блок А.Н.Да, программисты M и вправду суровы
Так все же начиналось с того, что на каждого пользователя отводилось 10 КБ памяти на переменные
Локальные переменые в основном используются для параметров циклов, "флажков" и еще так, по-мелочи...
...
Рейтинг: 0 / 0
переменные пропущенные в команде New
    #34642778
LittleCat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergei Obrastsov
Блок А.Н.
А если там в локальной памяти болтаются мегабайты локальных переменных, то не лучше ли их поместить во временный глобал?

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

Есть подозрение, что разработчики движка БД меньше внимания уделяют эффективности работы с локальными переменными, нежели с глобальными. Если в программе обрабатывается большой массив, то вариант с использованием глобального массива работает быстрее, легко проверяется. Поэтому совет сделать временные переменные (прежде всего массивы конечно) глобальными не такой уж и глупый :-)
...
Рейтинг: 0 / 0
переменные пропущенные в команде New
    #34643127
Sergei Obrastsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LittleCat Sergei Obrastsov
Блок А.Н.
А если там в локальной памяти болтаются мегабайты локальных переменных, то не лучше ли их поместить во временный глобал?

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

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

Насчет быстрее - я усомнюсь. Одно чтение и три чтения, даже из памяти, это разные вещи.
Если мы конечно сравниваем неиндексированную переменную с глобалем.
...
Рейтинг: 0 / 0
переменные пропущенные в команде New
    #34643494
Sergei Obrastsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блок А.Н. авторВот как раз это мне делать ни к чему. Я не гоняю по кругу одни и те же имена.
Это как?! 8-|
У вас переменные называются SpecialVarIForRoutine1,SpecialVarSumForRoutine2?

По себе судите? :) Нет, не так.

Блок А.Н.
я например видел, что из-за описки в написании имени переменной в списке new переменная перетирала переменную на два вызова выше.

А нечего с ним играться.

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

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

Блок А.Н.
при большом числе локальных переменных помещение их во временные глобалы дает выигрыш по скорости, причем заметный. Глобальный алгоритм в каше точно такой же, как и локальный, добавляется только знак ^. Переменные типа i можно в глобал не запихивать, а вот массивы - желательно. Кстати, отслеживать работу программы проще.

Вот опять. Если под "глобальным алгоритмом" понимать нотацию в духе var(i1,i2,in) , то да,
такой же. Если же, что более правильно, "механизм поиска данных", то все начинает выглядеть
несколько по-другому. Поскольку для локальных переменных - это поиск в одной таблице (в памяти, ага), а для глобальных - в блоках, причем МИНИМУМ в 3-х. Впрочем, есть одно НО.
Похоже для индексированной локальной переменной поиск ведется последовательно. И явно
не настолько оптимально, как это было сделано в адекватных реализациях M на PC.

Блок А.Н.
авторИх не трудно прикинуть.
их не так трудно и посчитать

[...]

использование безагрументного new в контексте 10000 переменных в два раза медленнее, чем для одной переменной. Ужос! Вот из-за чего оказывается все тормозит

Во-первых, даже в контексте 100 переменных разница оказывается МИНИМУМ в полтора-два раза.
Во-вторых, я бы посоветовал писать в переменные данные адекватные, то есть подлиннее.
В-третьих, при использовании локального массива разница увеличивается до 4 раз.
Ну и, в-четвертых, вспоминаем о насущном использовании этой программы. Если она будет вызываться раз в неделю, то нечего и заморачиваться оптимизированием. Ну а если нет?
...
Рейтинг: 0 / 0
переменные пропущенные в команде New
    #34644485
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторПо себе судите? :) Нет, не так.
Нет, почему же. Я пытаюсь интерпретировать ваше
автор Я не гоняю по кругу одни и те же имена.
Сам я как человек с ограниченной фантазией использую во всех программах переменные i,j,sum,sum1...
:'-(

авторА нечего с ним играться.
С чем? Кто здесь?!
программы не мои были и там использовали как раз списочный NEW

Насчет быстродействия:
команда New вызывается один раз, в программе же десятки-сотни команд, которые еще могут быть организованы в циклы. Так что экономия на команде new дает оочень маленкький выигрыш. Гораздо больше выигрышь даст оптимизация алгоритма.

Согласен, в программах типа
Код: plaintext
1.
sum(a,b)
q a+b
Безаргументный new использовать не стоит.

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

Если вы уверены в том, что это не так, докажите примерно тем же способом, что и я.
На слово не верю! ;-)

PS.
А вот некоторые через объекты работают - вот там все-таки заметнее падение скорости. И ничего... Не всегда скорость главный критерий.
Я не призываю писать похабные программы, которые написаны по принципу - ну работает же, чего тебе еще надо?
Но лучшее - враг хорошего, и оптимизируя оператор, который за программу выполняется один раз, можно не заметить гораздо большие промахи.
...
Рейтинг: 0 / 0
переменные пропущенные в команде New
    #34649031
Sergei Obrastsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блок А.Н. авторПо себе судите? :) Нет, не так.
Нет, почему же. Я пытаюсь интерпретировать ваше
автор Я не гоняю по кругу одни и те же имена.
Сам я как человек с ограниченной фантазией использую во всех программах переменные i,j,sum,sum1...

Не надо выдергивать фразы из контекста. Речь шла о "переиспользовании" переменных.
Иначе нафига бы понадобился New. Для красоты?

Блок А.Н.
Насчет быстродействия:
команда New вызывается один раз, в программе же десятки-сотни команд, которые еще могут быть организованы в циклы. Так что экономия на команде new дает оочень маленкький выигрыш. Гораздо больше выигрышь даст оптимизация алгоритма.

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

Блок А.Н.
Но в целом безагрументный new очень даже не затратен, а для больших программ, где как раз и опасно ошибиться в списке new - и вовсе незаметен. Мне непонятно, с чем вы спорите?

С политикой "очень даже не затратен". Мне конечно пофигу, это ваши программы и ваши пользователи.

Блок А.Н.
Если вы уверены в том, что это не так, докажите примерно тем же способом, что и я.
На слово не верю! ;-)

А тут и не надо ничего доказывать. Вы сами обнаружили разницу в 2 раза. Вам этого мало?
Тогда нам не о чем говорить.

Блок А.Н.
А вот некоторые через объекты работают - вот там все-таки заметнее падение скорости. И ничего... Не всегда скорость главный критерий.

А что же есть "главный критерий"? Если мы конечно не пишем программы по принципу "главное чтобы правильно, а там хоть сутки пусть работает". Особенно, если мы говорим о веб-интерфейсах
и прочих запросных делах.

Блок А.Н.
Но лучшее - враг хорошего, и оптимизируя оператор, который за программу выполняется один раз, можно не заметить гораздо большие промахи.
Мы говорим об операторе, который мало того, что скрывает логику, но еще и тормозит программу.
Похоже, что вы не сталкивались с программами, критичными по времени выполнения. Тогда вопрос снимается, что толку впустую болтать.
...
Рейтинг: 0 / 0
переменные пропущенные в команде New
    #34649086
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор нафига бы понадобился New
Я не понимаю цели вопроса. Вы ведь вроде знаете, для чего используется оператор new?
Или вы считаете, что я не понимаю?

автор Вы сами обнаружили разницу в 2 раза
Да, разницу, эквивалентную еще одному дополнительному оператору сложения.
Разницу, равную 2 секундам на миллион вызовов.
У вас есть программы, которые вызываются 30 миллионов раз в день? Тогда суммарная экономия на new будет равна 1 минуте, да и то меньше, потому что тест я делал далеко не на самой мощной машине. Тогда конечно, есть смысл экономить на каждом операторе. Но я сильно сомневаюсь в этом.

авторМы говорим об операторе, который мало того, что скрывает логику, но еще и тормозит программу.
Какой страшный оператор! Какую логику он скрывает?

Похоже, что вы не сталкивались с программами, критичными по времени выполнения.
на одну двухмиллионную секунды?! Нет, не сталкивался. Минуты, секунды, десятые доли секунд - да. Но миллионные доли секунд?
Даже если у вас действительно такой случай, то
1.вряд ли он типичен для разработчиков СУБД
2.вы не пишете программы из десятков и сотен строк со сложной логикой, а я говорю как раз о таком случае.

авторОсобенно, если мы говорим о веб-интерфейсах
У вас веб интерфейсы = системы управления ракетными комплексами?
Для веб как раз миллионные доли секунды не значат ничего.
Гораздо больше времени тратится на передачу страницы каше->веб сервер->браузер->построение интерфейса в браузере.

авторА что же есть "главный критерий"?
У всех наверно по разному, могу предположить один из вариантов
1.Правильность работы программы - неправильная программа хуже, чем отсутсвие любой программы
2.Срок выполнения - какое-то время ваша мегаоптимальная программа заказчику возможно будет уже не нужна, как и вы сами.
3.Оптимальность работы программы - ресурсоемкость при выполнении.



авторвопрос снимается, что толку впустую болтать.
да, пожалуй. Аргументы пошли по кругу
...
Рейтинг: 0 / 0
переменные пропущенные в команде New
    #34652038
Sergei Obrastsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блок А.Н. автор Вы сами обнаружили разницу в 2 раза
Да, разницу, эквивалентную еще одному дополнительному оператору сложения.
Разницу, равную 2 секундам на миллион вызовов.
У вас есть программы, которые вызываются 30 миллионов раз в день? Тогда суммарная экономия на new будет равна 1 минуте, да и то меньше, потому что тест я делал далеко не на самой мощной машине. Тогда конечно, есть смысл экономить на каждом операторе. Но я сильно сомневаюсь в этом.

Ну что же, мой вариант:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
a		;
		k  d var ;тут переменные создаются
		;
		s idx= 1  ;это счетчик повторов
		;
		s t=$zh f r= 1 : 1 :idx d n1 i r=idx w !,"n1 = ",$zh-t
		s t=$zh f r= 1 : 1 :idx d n2 i r=idx w !,"n2 = ",$zh-t
		s t=$zh f r= 1 : 1 :idx d n3 i r=idx w !,"n3 = ",$zh-t
		q
 
var		;
		s varx="1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
		f f= 1 : 1 : 10  s @("var"_f)=$e(varx, 1 ,$r( 62 )+ 1 )
		q

n1		;
		s var1= 100 
		q
		
n2		;
		n var1
		s var1= 100 
		q
		
n3		;
		n
		s var1= 100 
		q

Как вы, надеюсь, заметили, переменных у нас создается только 10 плюс 5 своих, в n2 New на одну переменную, внутренняя операция в процедурах адекватная. И прогон будет всего один. Погоняем?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
USER>d ^a
 
n1 = . 000003 
n2 = . 000007 
n3 = . 000021 
USER>d ^a
 
n1 = . 000003 
n2 = . 000006 
n3 = . 000021 
USER>d ^a
 
n1 = . 000004 
n2 = . 000007 
n3 = . 000021 
USER>

Вот только не надо, пожалуйста, меня укорять "суммарной экономией в 2 секунды" и прочей лабудой. New сейчас модно совать
куда угодно, это уже стало неким неофициальным стандартом оформления процедуры. Ну а процедуры вызываются куда чаще,
чем программы. Скажем, некоторые процедуры у меня вызываются в среднем 100,000-150,000 раз в сутки.
Это конечно, не миллионы, но все же. А разница "в разы" меня совсем не устраивает.

Что касается дальнейших экспериментов, то я не стал публиковать кучу результатов. Хотя
при увеличении числа переменных и использовании локальных массивов картина менятся
в худшую сторону. Доходит до 13-14 раз.

Блок А.Н.
автор
Мы говорим об операторе, который мало того, что скрывает логику, но еще и тормозит программу.

Какой страшный оператор! Какую логику он скрывает?

Не стоит упражняться в сарказме. New - оператор неявной логики, выражается она в подмене
значения конкретной переменной, происходящей при возврате из процедуры, в которой
использовался New на ней. Вы видите где-то в этом процессе возврата явный Set? Я не вижу.
Сами же упоминали пропуск переменной в списке New. Вот где оно и играет.

Блок А.Н.
Похоже, что вы не сталкивались с программами, критичными по времени выполнения.
на одну двухмиллионную секунды?! Нет, не сталкивался. Минуты, секунды, десятые доли секунд - да. Но миллионные доли секунд?
Даже если у вас действительно такой случай, то
1.вряд ли он типичен для разработчиков СУБД
2.вы не пишете программы из десятков и сотен строк со сложной логикой, а я говорю как раз о таком случае.

Похоже, вы как-то слабо себе представляете то, о чем мы говорим. "Миллионные доли секунд" -
обработка одной записи в БД (я утрирую конечно). Представьте, что вы вызываете при этом
процедуру, в которой стоит ваш обожаемый New... и вот, одна миллионная доля секунды
уже превращается в 7 миллионных. Вам трудно представить себе БД из миллиона записей?
Сочувствую. А у меня их уже 152. И не надо мне говорить про сложную логику, ладно? :)
...
Рейтинг: 0 / 0
переменные пропущенные в команде New
    #34652094
Ptn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergei Obrastsov >> Вам трудно представить себе БД из миллиона записей? Сочувствую. А у меня их уже 152. И не надо мне говорить про сложную логику, ладно? :)

Там не один миллион и не два ;) У них этих миллионов вполне достаточно.

ЗЫ: безаргументный new зло.
...
Рейтинг: 0 / 0
переменные пропущенные в команде New
    #34652174
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я рад, что вы перешли к более аргументированным способам доказательства

Проверяю ваш вариант один в один. Результат предоствляю интерпретировать вам
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
USER>d ^testnew2
 
n1 = . 000009 
n2 = . 000006 
n3 = . 000016 
USER>d ^testnew2
 
n1 = . 000007 
n2 = . 000005 
n3 = . 000014 
USER>d ^testnew2
 
n1 = . 000008 
n2 = . 000005 
n3 = . 000014 

То же, но со включенным монитором
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
n1 = . 000018 
n2 = . 00002 
n3 = . 000032 
USER>d ^testnew2
 
n1 = . 000016 
n2 = . 000017 
n3 = . 000027 
USER>d ^testnew2
 
n1 = . 000015 
n2 = . 000016 
n3 = . 000025 

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
Результаты мониторинга
Line    RtnLine       Time  TotalTime
 1               3     0 . 000015     0 . 000015  a         ;  ; Compiled July  11 ,  2007   10 : 35 : 22 
 2               3     0 . 000063     0 . 000187    k  d var ;тут переменные создаются
 3               3     0 . 000006     0 . 000006    ;
 4               3     0 . 000008     0 . 000008    s idx= 1  ;это счетчик повторов
 5               3     0 . 000004     0 . 000004    ;
 6               3     0 . 000049     0 . 000074    s t=$zh f r= 1 : 1 :idx d n1 i r=idx w !,"n1 = ",$zh-t
 7               3     0 . 000033     0 . 000072    s t=$zh f r= 1 : 1 :idx d n2 i r=idx w !,"n2 = ",$zh-t
 8               3     0 . 000032     0 . 000102    s t=$zh f r= 1 : 1 :idx d n3 i r=idx w !,"n3 = ",$zh-t
 9               3     0 . 000150     0 . 000150    q
 10              3     0 . 000007     0 . 000007  var       ;
 11              3     0 . 000011     0 . 000011    s varx="1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
 12              3     0 . 000091     0 . 000091    f f= 1 : 1 : 10  s @("var"_f)=$e(varx, 1 ,$r( 62 )+ 1 )
 13              3     0 . 000010     0 . 000010    q
 14              3     0 . 000006     0 . 000006  n1        ;
 15              3     0 . 000007     0 . 000007    s var1= 100 
 16              3     0 . 000006     0 . 000006    q
 17              3     0 . 000006     0 . 000006  n2        ;
 18              3     0 . 000013     0 . 000013    n var1
 19              3     0 . 000006     0 . 000006    s var1= 100 
 20              3     0 . 000009     0 . 000009    q
 21              3     0 . 000006     0 . 000006  n3        ;
 22              3     0 . 000035     0 . 000035    n
 23              3     0 . 000006     0 . 000006    s var1= 100 
 24              3     0 . 000017     0 . 000017    q

При использовании большего числа переменных разница увеличивается до 10 раз, на самом деле.
Что доказывает, две вещи
1.безаргументный new неоправданно использовать в программах из двух строчек. А это я не отрицал, почитайте мои посты
2.нехорошо держать в локальной памяти большие объемя данных. Вы с этим будете спорить? Они ведь не только на new влияют.

авторВам трудно представить себе БД из миллиона записей? Сочувствую. А у меня их уже 152
Несколько терабайт данных? И вы каждую запись обрабаываете отдельной процедурой?
Да нет, не мне нужно сочуствовать :-)

Что за система то и на чем она крутится, если не секрет (это без подколов, мне просто интересно)?

Кстати, я говорил о сложности обработки, а не о объеме данных. Для сверхбольшого объема данных и простой обработки безаргументный new не оправдан, это я говорю уже в который раз в этой теме.

автор New - оператор неявной логики
Не более неявной, чем остальные. Нужно просто понимать, что для чего используется. А от неявности здесь не уйти - мы не на ассемблере.
w "10 Лен"+"20 Вась"
Вот вам пример гораздо более неявной операции

авторстоит ваш обожаемый New
Как в том анекдоте: "Вась, ты помидоры любишь? Есть люблю. А так - нет"

Бывают разные случаи, иногда один подход более оправдан, иногда другой. Вы с этим спорить будете?
Кстати, успокою вас, большую часть времени из работы с каше я занимаюсь поиском ошибок, среди который были и ошибки в списке new. Если же пишу программы, то new там либо вообще не используется (нет необходимости), либо используется по минимуму. И только при правке чужих достаточно больших программ, где можно запросто поломать мозг во время поиcка ошибки, при подозрение на конфликт переменных часто проще написать n (x1,x2,x2)
В пятерке же проще использовать procedure block и приватные переменные, так что по сути дела весь этот спор не очень актуален.
...
Рейтинг: 0 / 0
переменные пропущенные в команде New
    #34652701
Sergei Obrastsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блок А.Н.
Код: plaintext
1.
2.
3.
n1 = . 000009 
n2 = . 000006 
n3 = . 000016 

Ну что ж, значит "проблема первого DO" существует не только у меня.
Большая просьба сдублировать строку, где "d n1" и повторить попытку.
Для чистоты эксперимента, так сказать.

Блок А.Н.
При использовании большего числа переменных разница увеличивается до 10 раз, на самом деле.
Что доказывает, две вещи
1.безаргументный new неоправданно использовать в программах из двух строчек. А это я не отрицал, почитайте мои посты
2.нехорошо держать в локальной памяти большие объемя данных. Вы с этим будете спорить? Они ведь не только на new влияют.

Странно, а ведь вроде все очевидно было. Переменных всего 15, где вы там нашли "большие объемы данных"? И причем тут "программы из двух строк", если речь идет о многократных вызовах?

Блок А.Н.
авторВам трудно представить себе БД из миллиона записей? Сочувствую. А у меня их уже 152
Несколько терабайт данных? И вы каждую запись обрабаываете отдельной процедурой?
Да нет, не мне нужно сочуствовать :-)

Нет, всего 26Gb, с учетом кучи индексов. А что, вы предлагаете другой вариант? Обрабатывать сразу все? :)

Блок А.Н.
Что за система то и на чем она крутится, если не секрет (это без подколов, мне просто интересно)?

Ничего секретного, аналитика данных о телефонных переговорах. Cache 5.0.11, Windows 2k Server

Блок А.Н.
автор New - оператор неявной логики
Не более неявной, чем остальные. Нужно просто понимать, что для чего используется. А от неявности здесь не уйти - мы не на ассемблере.
w "10 Лен"+"20 Вась"
Вот вам пример гораздо более неявной операции

Нет, операция здесь явная. Все на виду, правила интерпретации строки в число известны.
Не более "неявная" чем c+2e-5 . В случае с New все по-другому. Ни результат, ни операция
не только не "явны", но и не видны в тексте программы вообще.

Блок А.Н.
при подозрение на конфликт переменных часто проще написать n (x1,x2,x2)

Действительно. Чего там париться-то. :)

Блок А.Н.
В пятерке же проще использовать procedure block и приватные переменные, так что по сути дела весь этот спор не очень актуален.
Я бы конечно мог сказать, что это еще хуже, чем New, но уж промолчу.
Действительно, все мои придирки неактуальны.
...
Рейтинг: 0 / 0
переменные пропущенные в команде New
    #34653961
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почему кстати первый раз вызов дольше? Это устойчивый результат.

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

авторЯ бы конечно мог сказать, что это еще хуже, чем New, но уж промолчу.
Что же может быть хуже new? Вы прямо интригуете :-)
...
Рейтинг: 0 / 0
переменные пропущенные в команде New
    #34654145
Hampster-Mumpster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Декабристы-таки разбудили Герцена :) Ясен пень, первое DO имеет право выполняться дольше: отводится память под переменные, может быть под фрэймы стека и т.д.
Предлагаю свой вариант теста. Пусть переменных будет не одна, а несколько.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
		k  d var ;тут переменные создаются
		;
		s idx= 100000  ;это счетчик повторов
		;
		s t=$zh f r= 1 : 1 :idx d n1
		w !,"n1 = ",$zh-t/idx
		s t=$zh f r= 1 : 1 :idx d n2
		w !,"n2 = ",$zh-t/idx
		s t=$zh f r= 1 : 1 :idx d n3
		w !,"n3 = ",$zh-t/idx
		s t=$zh f r= 1 : 1 :idx d n4
		w !,"n4 = ",$zh-t/idx
		q
 
var		;
		s varx="1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
		f f= 1 : 1 : 10  s @("var"_f)=$e(varx, 1 ,$r( 62 )+ 1 )
		q

n1		;
	s var1="1234567890ABCDEFGHIJKL"
	s var10="1234567890ABCDEFGHIJKLMNOPQRSTUVWX"
	s var2="1234567890ABCDEFGHIJKLMNOPQRS"
	s var3="1234567890ABCDEFGHIJKLM"
	s var4="1234567890ABCD"
	s var5="1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvw"
	s var6="1234567890ABCDEFGHIJKLMNOPQRSTUV"
	s var7="1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxy"
	s var8="1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijkl"
	s var9="1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdef"
	q
		
n2		;
	n var1,var2,var3,var4,var5,var6,var7,var8,var9,var10
	s var1="1234567890ABCDEFGHIJKL"
	s var10="1234567890ABCDEFGHIJKLMNOPQRSTUVWX"
	s var2="1234567890ABCDEFGHIJKLMNOPQRS"
	s var3="1234567890ABCDEFGHIJKLM"
	s var4="1234567890ABCD"
	s var5="1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvw"
	s var6="1234567890ABCDEFGHIJKLMNOPQRSTUV"
	s var7="1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxy"
	s var8="1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijkl"
	s var9="1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdef"
	q
		
n3		;
	n (varx)
	s var1="1234567890ABCDEFGHIJKL"
	s var10="1234567890ABCDEFGHIJKLMNOPQRSTUVWX"
	s var2="1234567890ABCDEFGHIJKLMNOPQRS"
	s var3="1234567890ABCDEFGHIJKLM"
	s var4="1234567890ABCD"
	s var5="1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvw"
	s var6="1234567890ABCDEFGHIJKLMNOPQRSTUV"
	s var7="1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxy"
	s var8="1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijkl"
	s var9="1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdef"
	q

n4() [varx] {
	s var1="1234567890ABCDEFGHIJKL"
	s var10="1234567890ABCDEFGHIJKLMNOPQRSTUVWX"
	s var2="1234567890ABCDEFGHIJKLMNOPQRS"
	s var3="1234567890ABCDEFGHIJKLM"
	s var4="1234567890ABCD"
	s var5="1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvw"
	s var6="1234567890ABCDEFGHIJKLMNOPQRSTUV"
	s var7="1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxy"
	s var8="1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijkl"
	s var9="1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdef"
 }
Результат:
Код: plaintext
1.
2.
3.
n1 = . 00000164155 
n2 = . 00000473403 
n3 = . 00001382306 
n4 = . 00000466332 
...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / переменные пропущенные в команде New
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]