powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / эффективность вызова подпрограмм/функций
24 сообщений из 24, страница 1 из 1
эффективность вызова подпрограмм/функций
    #37910719
Фотография DirksDR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Задался вопросом, как писать на Каше эффективные расчетные программы: большие и длинные с подпрограммами, или маленькие и короткие, которые друг к другу обращаются.
Например, 100 небольших функций объединить в одну программу, или не объединять?
Влияет ли это на скорость выполнения кода?
Под "программой" здесь понимается int или mac модуль.

Написал тест:
testcall ;
s vzts=$zts
for i=1:1:1000000 do ;
.;s c=$$testcall2(2,3) ;вызов внутренней процедуры/функции
.;s c=$$testcall^OMvalue(2,3) ;вызов внешней процедуры/функции (лежит в длинной программе 350строк)
.s c=$$testcall2^testcall(2,3) ;вызов внешней процедуры/функции (лежит в короткой программе 20строк)

w !,$p($zts,",",2)-$p(vzts,",",2)," сек"
q

testcall2(a,b) ;поверка эффективности внешних вызовов
q a+b


Результаты:
.281 сек - вызов внутренней процедуры/функции,точнее 1000000 вызовов
.312 сек - вызов внешней процедуры/функции (лежит в короткой программе 20строк)
.437 сек - вызов внешней процедуры/функции (лежит в длинной программе 350строк)

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

1.Придерживаетесь ли Вы каких-то ограничений на размер программ?

2.Может есть другие моменты, типа, надо писать модули размером 32кб, чтобы получить эффективное кэширование программ?
...
Рейтинг: 0 / 0
эффективность вызова подпрограмм/функций
    #37910893
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как рассказывал Сергей Кудинов на одной из школ. чем меньше стек тем лучше, думаю тем более для расчетного кода.
на счет скорости выполнения в зависимости от размера исходника, полагаю стоит попробовать еще поиграть с размером буфера программ

обычно придерживаемся тем ограничением при котором программа просто перестает компилится из-за большого размера
...
Рейтинг: 0 / 0
эффективность вызова подпрограмм/функций
    #37910993
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DirksDR ,

Для большей производительности по возможности лучше вовсе отказаться от вызова функций/процедур (стр. 33, 36-41; ссылка ниже):
testcall
 
 #define testcall2(%a,%b) %a+%b
 
 n t,i,c
 
 #;вызов внутренней процедуры/функции
 s time=$zh for i=1:1:1000000 s c=$$testcall2(2,3)
 w !,$zh-time," сек."
 
 s time=$zh for i=1:1:1000000 s c=$$$testcall2(2,3)
 w !,$zh-time," сек."

testcall2(a,b) ;поверка эффективности внешних вызовов 
 q a+b
Код: plaintext
1.
2.
3.
USER>d ^testcall
 
.278312 сек.
.010367 сек.

General System Limits

Оптимизация Caché-приложений (pdf, автор: Сергей Кудинов)
...
Рейтинг: 0 / 0
эффективность вызова подпрограмм/функций
    #37912012
Фотография DirksDR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо ответившим!

servit,

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

DAiMor

Вы, наверное, широко используете макроподстановки, раз у Вас получаются такие тексты, что "программа просто перестает компилится из-за большого размера " :)
...
Рейтинг: 0 / 0
эффективность вызова подпрограмм/функций
    #37912026
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
макросы конечно активно, но в основном они достаточно простые
и не так сложно написать программу которая будет при компиляции ругаться на большой размер. обычно у меня было так когда строк кода переваливало за 5-6 тыс.
...
Рейтинг: 0 / 0
эффективность вызова подпрограмм/функций
    #37912067
D_De1mos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DAiMorмакросы конечно активно, но в основном они достаточно простые
и не так сложно написать программу которая будет при компиляции ругаться на большой размер. обычно у меня было так когда строк кода переваливало за 5-6 тыс.
Расскажите пожалуйста секреты отладки программы на 5 тыс строк :)
...
Рейтинг: 0 / 0
эффективность вызова подпрограмм/функций
    #37912119
Alexey Maslov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DirksDRПрименение макроса вообще впечатлило, надо почитать и взять на вооружениеИспользую макросы, но довольно ограниченно. Например, чтобы написать код, который будет работать в разных версиях Cache (есть где-то в запасниках пара макросов: $$$LISTFROMSTRING и $$$LISTTOSTRING :).
Но заменить макросами существующие подпрограммы и функции (почти никогда) не получится, т.к.
либо придётся превратить функцию в "oneliner",

либо, в случае многострочных макросов, перелопатить код, чтобы макровызов стал единственной командой в строке.
...
Рейтинг: 0 / 0
эффективность вызова подпрограмм/функций
    #37912170
AlexKB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
D_De1mosDAiMorмакросы конечно активно, но в основном они достаточно простые
и не так сложно написать программу которая будет при компиляции ругаться на большой размер. обычно у меня было так когда строк кода переваливало за 5-6 тыс.
Расскажите пожалуйста секреты отладки программы на 5 тыс строк :)

Секрет очень прост - поменьше "программировать в дисплей" и вспомнить что есть такие понятие, как "машинонезависимая оптимизация программ", "отладка программы по листингу".
...
Рейтинг: 0 / 0
эффективность вызова подпрограмм/функций
    #37912189
AlexKB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey MaslovDirksDRПрименение макроса вообще впечатлило, надо почитать и взять на вооружениеИспользую макросы, но довольно ограниченно. Например, чтобы написать код, который будет работать в разных версиях Cache (есть где-то в запасниках пара макросов: $$$LISTFROMSTRING и $$$LISTTOSTRING :).
Но заменить макросами существующие подпрограммы и функции (почти никогда) не получится, т.к.
либо придётся превратить функцию в "oneliner",

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


Использую макросы интенсивно, в том числе многострочные. Именно использование макросов позволило мне существенно увеличить быстродействие.
Когда-то проводил ислледования на предмет поиска скрытых резервов Cache. Правда их никто не скрывал, просто мы очень "ленивые", чтобы посмотреть поглубже.
В Cache действительно очень много различных приемов для оптимизации быстродействия кода. В свое время радовался каждой сэкономленной микросекунде. В результате всех ухищрений удалось сэкономить аж целых 20 миллисекунд!!! Это для меня было очень много и дальше я не стал этим заниматься. Именно эти 20 миллисекунд сыграли решающую в выборе технологии Cache, в свое время, перед остальными.
...
Рейтинг: 0 / 0
эффективность вызова подпрограмм/функций
    #37912221
AlexKB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Использование в программах макросов многострочных (подпрограмм).
Код: c#
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.
 //////////////////// Включенные функции многострочные 
Usr(var,time)	; 
 $$$Usr
CmdValue(Win,Element,Value) ;
 $$$CmdValue
SetVar(var,val) ;
 $$$SetVar
Timer(number,pres) ;
 $$$Timer
StartTimer(number) ; 
 $$$StartTimer
SetStep(alg,step) ;
 $$$SetStep
Step(alg) 
 $$$Step
SetPrTeg(prot,teg,val)  
 $$$SetPrTeg
SetPrTxt(prot,teg,val,Cond=0)
 $$$SetPrTxt
FormProt(tampl)   
 $$$FormProt
Print(prot) 
 $$$Print
BazaProtocol(Bazprot)
 $$$BazaProtocol
StopTimer(number)
 $$$StopTimer
 //////////////////// Конец Включенные функции многострочные 



Если у меня много программ используют одни и те же подпрограммы, то разумно их вынести в отдельную рутину. Но для интенсивных вычислений такой способ приведет к потере быстродействия перед вышеприведенным способом.
Останется в inc файле разместить многострочные макросы, по сути подпрограммы, а в своей программе вызывать их как свои подпрограммы. Мы сейчас не будем обсуждать удобства сопровождения таких подпрограмм, на этот счет есть тоже множество приемов.
Но именно такой подход, в свое время, дал мне драгоценные, кажется 5-7 миллисекунд.
...
Рейтинг: 0 / 0
эффективность вызова подпрограмм/функций
    #37912239
AlexKB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ой, не все привел, извиняюсь.
Код: 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.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
 #include Alg
Alg1005 //Алгоритм Ложного Запуска двигателя
  //Переход по текущему шагу
  Do $Case($Get(^SPR("Alg",1005,"step")),1:Step1,
                                         2:Step2,
                                         3:Step3,
                                         4:Step4,                                  
                                    "INIT":INIT,
                                     "END":END,
                                          :NoStep)
  Quit  //Выход из алгоритма    
 
NoStep //Выход по неопределенному шагу 
  Set ^LogErrorTA("Error",$ZHorolog)="Ошибка при исполнении алгоритма Alg1005: Неопределенный шаг"
      //вставка реакции на ошибку
  Set ^SPR("Alg",1005,"step")="INIT" //Установить шаг исполнения INIT для алг 1005
  Set ^SPR("Alg",1005.1,"step")=1 //Установить шаг исполнения 1 для алг 1005.1
  Set ^SPR("Alg",1005.2,"step")=1 //Установить шаг исполнения 1 для алг 1005.2
  Quit
 
INIT // шаг инициализации исполняется однократно и безусловно
  //Установка следующего шага
  Do SetStep(1005,1) //Установить шаг исполнения 1 для алг 1005
  Quit
 
END //шаг остановки алгоритма из этого шага выход только принудительный
  Quit
  
Step1 
  $$$ClearProtokol("Prot15")
  $$$ClearProtokol("Shapka15")
  if $$$SV(7041)
  {
    Do SetPrTeg("Prot15", "text01", $zt($p($h,",",2)))
    Do SetStep(1005.1,1) //Установить шаг исполнения 1 для алг 1005.1
    Do SetStep(1005.2,1) //Установить шаг исполнения 1 для алг 1005.2
    Do SetStep(1005,3) 
    quit //
  }  
  if $$$SV(2351){Do SetStep(1005,2) quit}
  Do SetStep(1005,1) 
  quit
 
Step2 // шаг 2
  Do StartTimer(1005)
  Do SetPrTeg("Prot15", "text01", $zt($p($h,",",2)))    // время
  Do SetPrTxt("Prot15", "text02", 1031)                 // режим
  Do SetPrTeg("Prot15", "Teg01", $$Usr(1301,2))  
  Do SetPrTeg("Prot15", "Teg02", $$Usr(1214,2))  
  Do SetPrTeg("Prot15", "Teg03", $$Usr(1103,2))  
  Do SetPrTeg("Prot15", "Teg04", $$Usr(1220,2))  
  Do SetPrTeg("Prot15", "Teg05", $$Usr(1318,2))  
  Do SetStep(1005,3)    //Установить шаг исполнения 3 для алг 1005
  Do SetStep(1005.1,1) //Установить шаг исполнения 1 для алг 1005.1
  Do SetStep(1005.2,1) //Установить шаг исполнения 1 для алг 1005.2
  quit
 
Step3 // шаг 2
  Do Alg1005V1 //Алг ЛЗ ветка 1
  Do Alg1005V2 //Алг ЛЗ ветка 2
  If (($$Step(1005.1)="END") && ($$Step(1005.2)="END"))
  {Do SetStep(1005,4)} //Установить шаг исполнения 3 для алг 1005
  quit
 
Step4
  Do StopTimer(1005)
  Do FormProt("Shapka15") ; Сформировать выбранный протокол
  Do Print("Shapka15") ; Печатать выбранный протокол
  Do FormProt("Prot15") ; Сформировать выбранный протокол
  Do Print("Prot15") ; Печатать выбранный протокол
  Do SetVar(516,"ЛЗ") //
  Do SetVar(517,"Протокол ЛЗ") //
  Do BazaProtocol("Prot15") ;
  Do SetVar(1, 1)
  Do SetVar(26, 3)  
  quit
 
 //--------------------------------------------------------------------------------------------
Alg1005V1 //ветка 1
  //Переход по текущему шагу
  Do $Case($Get(^SPR("Alg",1005.1,"step")), 1:Step1V1,
                                        "END":ENDV1,
                                             :NoStep)
  Quit  //Выход из ветки 1    
 
Step1V1
  if ($$$SV(7041) || ($$$SV(2351)=0))
   {Do SetStep(1005.1,"END") Quit}
  if ($$Usr(1118,2)>0.5)
  {
    Do SetPrTeg("Prot15", "Teg21", $$Usr(1303,2))  
    Do SetStep(1005.1,"END")
  }
  Quit
 
ENDV1 
  Quit
 
 //--------------------------------------------------------------------------------------------
Alg1005V2 //Алг Запуска ветка 2
  //Переход по текущему шагу
  Do $Case($Get(^SPR("Alg",1005.2,"step")),1:Step1V2,
                                           2:Step2V2,
                                           3:Step3V2,
                                           4:Step4V2,
                                           5:Step5V2,
                                       "END":ENDV2,
                                            :NoStep)
  Quit  //Выход из ветки 2    
 
Step1V2
  if ($$$SV(7041) || ($$$SV(2351)=0))
   {Do SetStep(1005.2,4) Quit}
  if ($$Timer(1005,3)>25)
   {
    Do SetVar(5, 0)  
    Do SetVar(6, 0)  
    Do SetPrTeg("Prot15", "Teg06", $$$TxtVal(25,1389))  
    Do SetPrTeg("Prot15", "Teg07", $$$TxtVal(25,1394))  
    Do SetStep(1005.2,2)
   }
  Quit
 
Step2V2
  if ($$$SV(7041) || ($$$SV(2351)=0))
   {Do SetStep(1005.2,4) Quit}
  if ($$Timer(1005,3)>50)
   {
    Do SetVar(7, 0)
    Do SetVar(8, 0)
    Do SetVar(27, 0)
    Do SetPrTeg("Prot15", "Teg08", $$$TxtVal(25,1387))
    Do SetPrTeg("Prot15", "Teg09", $$Usr(1304,2))
    Do SetPrTeg("Prot15", "Teg10", $$$TxtVal(25,1386))
    Do SetPrTeg("Prot15", "Teg12", $$$TxtVal(25,1388))  
    Do SetStep(1005.2,3)
  }
  Quit
 
Step3V2
  if ($$$SV(7041) || ($$$SV(2351)=0))
   {Do SetStep(1005.2,4) Quit}
  Quit
 
Step4V2
  set tmp=$$Timer(1005,1)
  Do CmdValue(25,1395,tmp)
  Do SetPrTeg("Prot15", "Teg11", tmp)
  if ($$Step(1004)="END") {Do SetStep(1004,1)} 
  Do SetStep(1005.2,5)
  quit
 
Step5V2
  Do ^Alg1004   //1004
  if ($$Step(1004)="END")
  {
    Do SetPrTeg("Prot15", "Teg13", $$$SV(4))
    Do CmdValue(25,1397,$$$SV(3))
    Do SetPrTeg("Prot15", "Teg14", $$$SV(3))
    Do CmdValue(25,1398,$$$SV(4))
    Do SetPrTeg("Prot15", "Teg15", $$Usr(1318,2))
    Do SetStep(1005.2,"END")
  }
  quit
 
ENDV2 
  Quit
  
 
 //////////////////// Включенные функции многострочные 
Usr(var,time)	; 
 $$$Usr
CmdValue(Win,Element,Value) ;
 $$$CmdValue
SetVar(var,val) ;
 $$$SetVar
Timer(number,pres) ;
 $$$Timer
StartTimer(number) ; 
 $$$StartTimer
SetStep(alg,step) ;
 $$$SetStep
Step(alg) 
 $$$Step
SetPrTeg(prot,teg,val)  
 $$$SetPrTeg
SetPrTxt(prot,teg,val,Cond=0)
 $$$SetPrTxt
FormProt(tampl)   
 $$$FormProt
Print(prot) 
 $$$Print
BazaProtocol(Bazprot)
 $$$BazaProtocol
StopTimer(number)
 $$$StopTimer
 //////////////////// Конец Включенные функции многострочные 
 
 
  
...
Рейтинг: 0 / 0
эффективность вызова подпрограмм/функций
    #37912390
Фотография DirksDR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexKB,

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

Кому-нибудь попадались общеупотребительные макробиблиотеки для Cache в инете?

И по ходу еще вопрос - есть ли макросы в GT.M, и совместимы ли по синтаксису?
...
Рейтинг: 0 / 0
эффективность вызова подпрограмм/функций
    #37912418
AlexKB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DirksDR,

Один из многих
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
#define Usr If +var'=var Quit 0 //##continue
 If $Data(^SystemVars(var))=0 Quit 0 //##continue
	Quit:$Data(USR("WORK",var))=0 ^SystemVars(var) //##continue
	Set:time>USR("SPR",var,"TIMEMAX") time=USR("SPR",var,"TIMEMAX") //##continue
	Quit:$Data(USR("TMP",var,time)) USR("TMP",var,time) //##continue
	Set countusr=time*20 //20 //countiter //##continue
	Set cell=USR("SPR",var,"TEK") //##continue
	Set max=USR("SPR",var,"MAX") //##continue
	Set pres=USR("SPR",var,"PRES") //##continue
	Set summ=0 //##continue
	For i=1:1:countusr //##continue
	 { //##continue
	  Set cell=cell-1 //##continue
	  Set:cell=0 cell=max //##continue
	  Set summ=summ+USR("WORK",var,cell) //##continue
	 } //##continue
	Set usr=$Justify(summ/countusr,"",pres) //##continue
	Set USR("TMP",var,time)=usr //##continue
	Quit usr //##continue
...
Рейтинг: 0 / 0
эффективность вызова подпрограмм/функций
    #37912423
Alexey Maslov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexKB,

почему предпочли функцию-обёртку над макросом без параметров
Код: javascript
1.
2.
3.
4.
CmdValue(Win,Element,Value) ;
 $$$CmdValue
...
 Do CmdValue(25,1395,tmp)

макросу с параметрами :
Код: javascript
1.
2.
3.
4.
#define CmdValue(%1, %2, %3)
...
...
 $$$CmdValue(25,1395,tmp)

еще бы и на вызове функции сэкономили...
...
Рейтинг: 0 / 0
эффективность вызова подпрограмм/функций
    #37912452
AlexKB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey MaslovAlexKB,

почему предпочли функцию-обёртку над макросом без параметров
Код: javascript
1.
2.
3.
4.
CmdValue(Win,Element,Value) ;
 $$$CmdValue
...
 Do CmdValue(25,1395,tmp)

макросу с параметрами :
Код: javascript
1.
2.
3.
4.
#define CmdValue(%1, %2, %3)
...
...
 $$$CmdValue(25,1395,tmp)

еще бы и на вызове функции сэкономили...

1. Функция обертка у меня только над многострочными макросами.
2. Потому что
Код: plaintext
1.
CmdValue(Win,Element,Value) ;

у меня может встречаться множество раз. И тогда макрос
Код: plaintext
1.
$$$CmdValue(25,1395,tmp)

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

4. А может и еще были причины, честно не помню - давно это быоо.

Задавшему вопрос, еще очень помогают экономить время генераторы программ, когда на основании справочных данных генерится программа, которая максимально содеожит константные выражения, и мало бегает по справочникам.
...
Рейтинг: 0 / 0
эффективность вызова подпрограмм/функций
    #37912513
Alexey Maslov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexKBразвернулся бы столько же разОно бы и ничего, особенно c 2011.1+ с ее большими программами (RoutineSize <= 8MB). Но вот написать многострочный макрос, пусть даже подпрограмму, а не функцию, чтобы его многократные развертывания правильно работали, не так-то просто. Слишком бедны штатные средства: ньючить-то нечего нельзя. Например, я могу определить только одну уникальную переменную: ##Unique(new), точнее я могу определить их сколько угодно, но сослаться смогу только на последнюю: ##Unique(old)
...
Рейтинг: 0 / 0
эффективность вызова подпрограмм/функций
    #37912551
AlexKB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey MaslovAlexKBразвернулся бы столько же разОно бы и ничего, особенно c 2011.1+ с ее большими программами (RoutineSize <= 8MB). Но вот написать многострочный макрос, пусть даже подпрограмму, а не функцию, чтобы его многократные развертывания правильно работали, не так-то просто. Слишком бедны штатные средства: ньючить-то нечего нельзя. Например, я могу определить только одну уникальную переменную: ##Unique(new), точнее я могу определить их сколько угодно, но сослаться смогу только на последнюю: ##Unique(old)

Ну это все делалось еще для 4-ки, потом переносилось на 5.0.21, дорабатывалось...
Для решений на более новых версиях не было таких жестких требований. Там уже были другие требования...

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

Для задавшего вопрос, еще дают выиграши использование однострочных IF и FOR, использование точечного синтаксиса - блочные подпрограммы, да еще много чего.
Все зависит от того, что требуется.
Также дает выиграш использование стиля программирования "80*24".
...
Рейтинг: 0 / 0
эффективность вызова подпрограмм/функций
    #37912646
Alexey Maslov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Жизнь не стоит на месте, и многое зависит от "целевой" версии Cache. В версии 2010.1 (более ранние уже плохо помню):многострочные if cond {...}, for {...} не проигрывают по скорости однострочным if и for
{скобки} быстрее, чем "точки"
процедуры быстрее, чем традиционные функции с New a,b,c.
Начиная с 2010.2:
ускорена работа с большими локальными массивами

улучшена производительность $PIECE/$FIND
Начиная с 2012.2, локальные массивы действительно получили право называться большими: предельный объём памяти процесса увеличен до 2TB.
Ну и много другого в разных версиях по мелочи улучшалось.
...
Рейтинг: 0 / 0
эффективность вызова подпрограмм/функций
    #37914282
Фотография DirksDR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexKB,

Еще раз спасибо.

>Также дает выиграш использование стиля программирования "80*24".

Сомневаюсь, что правильно понял, что Вы имели ввиду. Это ведь размер экрана терминала?
Встречал рекомендации, не имеющие отношения к Каше, так делить программы на модули,
чтобы текст каждого модуля умещался на одном экране.
Мол, так легче для понимания и сопровождения. ИМХО, перегиб, надо хотя бы 72 строки на модуль(страница А4).
Говоря о выигрыше, Вы имели в виду выигрыш от хорошего стиля программирования?
...
Рейтинг: 0 / 0
эффективность вызова подпрограмм/функций
    #37914331
AlexKB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DirksDRAlexKB,

Еще раз спасибо.

>Также дает выиграш использование стиля программирования "80*24".

Сомневаюсь, что правильно понял, что Вы имели ввиду. Это ведь размер экрана терминала?
Встречал рекомендации, не имеющие отношения к Каше, так делить программы на модули,
чтобы текст каждого модуля умещался на одном экране.
Мол, так легче для понимания и сопровождения. ИМХО, перегиб, надо хотя бы 72 строки на модуль(страница А4).
Говоря о выигрыше, Вы имели в виду выигрыш от хорошего стиля программирования?

На самом деле я могу ошибаться, поскольку скоростные исследования проводил очень давно, а жизнь не стоит на месте, как справедливо заметил тов. Маслов.
Поэтому, многие мои рекомендации могут быть не верными на данный момент.
24*80, я имел ввиду размещать в одной строке побольше команд, не злоупотреблять пробелами, избегать комментариев, которые попадут в obj-программу.
Но на сегодняшний день это уже может уже и не иметь заметного выиграша.
Тут нужно экспериментировать и находить наиболее приемлемые варианты, постоянно балансируя между скоростью и читаемостью кода.

Если у Вас Каше последних версий, то в добавок могу сказать:
1. Если у Вас инженерные расчеты, то скорость может добавить вычисление данных во float-представлении.
2. Если данные поступают от измерительных систем, то можно использовать Кашовские упаковки распаковки входных данных и полученных результатов (там теперь есть float и битовые преобразования).
3. Если у Вас выисления находятся в разных процессах, или обмены и вычисления находятся в разных процессах, то хорошо использовать координацию такой работы при помощи семафоров и почтовых ящиков - очень хорошая скорость переключения между процессами и прогнозируемая, управляемая координация работы процессов.
4. Если при вычислениях интенсивно используются данные в глобалах, то желательно такие данные размещать в одном глобале, тщательно спроек4тировать структуру глобала, чтобы уменьшить число обращений. Также использовать неполный синтаксис глобала, но очень осторожно.
5. Если в результате расчетов должна интенсивно расти БД, то лучше заранее разметить ее размером побольше, в сплошной области на диске.
6. Ну и еще куча всего: временные глобалы, отключение сортировки, отключение журналирования, и т.д и т.п.

А главное - мои советы не догма. Прислушивайтесь и к другим форумчан и делайте свои собственные выводы, опираясь на результаты Ваших исследований.
...
Рейтинг: 0 / 0
эффективность вызова подпрограмм/функций
    #37914644
Alexey Maslov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexKB,

что (какие конструкции) вы использовали в качестве семафоров и почтовых ящиков?
...
Рейтинг: 0 / 0
эффективность вызова подпрограмм/функций
    #37914742
AlexKB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey MaslovAlexKB,

что (какие конструкции) вы использовали в качестве семафоров и почтовых ящиков?

class %SYSTEM.Event
Там есть подробное описание использования - очень удобная штучка!
...
Рейтинг: 0 / 0
эффективность вызова подпрограмм/функций
    #37914745
AlexKB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все прям как в ОСРВ, даже проще.
...
Рейтинг: 0 / 0
эффективность вызова подпрограмм/функций
    #37914765
AlexKB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А в последней версии так еще и между машинами - просто БОМБА!!!
Правда последнее я не проверял - просто так думаю.

Если это действительно так, то мало какая ОСРВ может подобным похвастаться.
...
Рейтинг: 0 / 0
24 сообщений из 24, страница 1 из 1
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / эффективность вызова подпрограмм/функций
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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