powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Как ускорить работы метода в классе?
15 сообщений из 15, страница 1 из 1
Как ускорить работы метода в классе?
    #34831850
Dysan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!
Есть такая проблема.
В классе Каши написано несколько методов которые
выполняют решение дифференциальных уравнений
все уравнения динамические и исполняються с помощью метода XECUTE
Всё прекрасно работает, но одна проблема - очень медленно!
т.к. задача решаеться большим кол-вом циклов а при большей точности кол-во
итераций только увеличиваеться.
Как увеличить скорость работы? Подскажите пожалуйста.
...
Рейтинг: 0 / 0
Как ускорить работы метода в классе?
    #34832021
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Меняй алгоритЬм!
----------
Cache for Windows NT (Intel) 5.0.20 (Build 6305) Fri Sep 16 2005 11:54:10 EDT
...
Рейтинг: 0 / 0
Как ускорить работы метода в классе?
    #34832519
Dysan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Алгоритм поменять нельзя
Знаю что на языке С он летает
Переписывать его на другом языке и подключать как dll слишком трудоемко
У меня возникла мысль что Каши когда компилиирует метод класса
и создает int программу много лишего текста тащит за собой
Может стоит создать самому эту int программу.
И вообще такой вопрос. Каши ведь ничего не компилирует в байт-код
т.е. посути он каждый раз всё заново интерпретирует? или я ошибаюсь
а если не ошибаюсь то ведь это очень замедляет скорость работы.
...
Рейтинг: 0 / 0
Как ускорить работы метода в классе?
    #34833352
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"Интерпритатору" далеко до "транслятора" это факт известный... Но как вариант можно рассмотреть "генерацию" программы с нужным (что там у тебя?) "кодом" и последующий ее запуск.

Хоть бы пример чтоли привел того что у тебя есть...
----------
Cache for Windows NT (Intel) 5.0.20 (Build 6305) Fri Sep 16 2005 11:54:10 EDT
...
Рейтинг: 0 / 0
Как ускорить работы метода в классе?
    #34833594
Dysan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пример не проблема. Метод Ньютона на Каши вот и весь пример.

Код: 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.
// Решает интергал разгона поезда, где a - начальная скорость, b - конечная скорость, w =  0  - то считаеться время, если =  1  - то расстояние
ClassMethod SIntR(Train As TEO.Train, a, b, w As %Integer) As %String
{
 s n=b-a if n< 0  {s n=n*(- 1 )}
 s profil =  0 
 //s y = Train.q0
 //--
 s FK = Train.Serie.Tag.GetAt(a)
 // s x = a
 XECUTE "Set y="_Train.q0_" Set x="_a_" Set ^U="_Train.Type.W.GetAt( 1 )
 s W1=^U
 XECUTE "Set y="_Train.q0_" Set x="_a_" Set ^U="_Train.Type.W.GetAt( 2 )
 s W2=^U
 s Fr1 = ((((Train.p+Train.q)*(a**w))/Train.Serie.TypeKoef)/(FK-((W2*Train.q)-(W1*Train.p)+((Train.p+Train.q)*profil))))
 //--
 s FK = Train.Serie.Tag.GetAt(b)
 //s x = b
 XECUTE "Set y="_Train.q0_" Set x="_b_" Set ^U="_Train.Type.W.GetAt( 1 )
 s W1=^U
 XECUTE "Set y="_Train.q0_" Set x="_b_" Set ^U="_Train.Type.W.GetAt( 2 )
 s W2=^U
 s Fr2 = ((((Train.p+Train.q)*(b**w))/Train.Serie.TypeKoef)/(FK-((W2*Train.q)-(W1*Train.p)+((Train.p+Train.q)*profil))))
 //--
 s v=a+ 1 
 s Sr =  0 
 for i= 2 : 1 :n- 1 
 {
	 s FK = Train.Serie.Tag.GetAt(b)
     //s x = v
     XECUTE "Set y="_Train.q0_" Set x="_v_" Set ^U="_Train.Type.W.GetAt( 1 )
     s W1=^U
     XECUTE "Set y="_Train.q0_" Set x="_v_" Set ^U="_Train.Type.W.GetAt( 2 )
     s W2=^U
     s Sr = Sr + ((((Train.p+Train.q)*(v**w))/Train.Serie.TypeKoef)/(FK-((W2*Train.q)-(W1*Train.p)+((Train.p+Train.q)*profil))))
     s v = v +  1 
 }
 //--
 s Result=((Fr1+Fr2)/ 2 )+Sr
 kill ^U,FK,W1,W2,Fr1,Fr2,v,i,n,Sr
 q Result
}

/// Решает интергал торможения поезда, где a - начальная скорость, b - конечная скорость, w =  0  - то считаеться время, если =  1  - то расстояние
ClassMethod SIntT(Train As TEO.Train, a, b, w As %Integer) As %String
{
 s n=b-a if n< 0  {s n=n*(- 1 )}
 s profil =  0 
 //s y = Train.q0
 //--
 s FK = Train.Serie.Tag.GetAt(a)
 //s x = a
 XECUTE "Set y="_Train.q0_" Set x="_a_" Set ^U="_Train.Type.WT.GetAt( 1 )
 s W1=^U
 XECUTE "Set y="_Train.q0_" Set x="_a_" Set ^U="_Train.Type.WT.GetAt( 2 )
 s W2=^U
 //s y = Train.p0
 XECUTE "Set y="_Train.p0_" Set x="_a_" Set ^U="_Train.Brake.BT.GetAt( 1 )
 s BT=^U
 s Ft1 = ((((Train.p+Train.q)*(a**w))/Train.Serie.TypeKoef)/((((- 1 )*W1)*Train.p)-(W2*Train.q)-((Train.p+Train.q)*profil)-(BT* 1000 )))
 //--
 s FK = Train.Serie.Tag.GetAt(b)
 //s x = b
 XECUTE "Set y="_Train.q0_" Set x="_b_" Set ^U="_Train.Type.W.GetAt( 1 )
 s W1=^U
 XECUTE "Set y="_Train.q0_" Set x="_b_" Set ^U="_Train.Type.W.GetAt( 2 )
 s W2=^U
 //s y = Train.p0
 XECUTE "Set y="_Train.p0_" Set x="_b_" Set ^U="_Train.Brake.BT.GetAt( 1 )
 s BT=^U
 s Ft2 = ((((Train.p+Train.q)*(b**w))/Train.Serie.TypeKoef)/((((- 1 )*W1)*Train.p)-(W2*Train.q)-((Train.p+Train.q)*profil)-(BT* 1000 )))
 //--
 s v=b+ 1 
 s St =  0 
 for i= 2 : 1 :n- 1 
 {
	 s FK = Train.Serie.Tag.GetAt(b)
     //s x = v
     XECUTE "Set y="_Train.q0_" Set x="_v_" Set ^U="_Train.Type.W.GetAt( 1 )
     s W1=^U
     XECUTE "Set y="_Train.q0_" Set x="_v_" Set ^U="_Train.Type.W.GetAt( 2 )
     s W2=^U
     //s y = Train.p0
     XECUTE "Set y="_Train.p0_" Set x="_v_" Set ^U="_Train.Brake.BT.GetAt( 1 )
     s BT=^U
     s St = St + ((((Train.p+Train.q)*(v**w))/Train.Serie.TypeKoef)/((((- 1 )*W1)*Train.p)-(W2*Train.q)-((Train.p+Train.q)*profil)-(BT* 1000 )))
     s v = v +  1 
 }
 //--
 s Result=(((Ft1+Ft2)/ 2 )+St)*(- 1 )
 kill ^U,FK,W1,BT,W2,Ft1,Ft2,v,i,n,St
 q Result
}

/// Решает интергал затраты энергии поезда, где a - начальная скорость, b - конечная скорость
ClassMethod SIntA(Train As TEO.Train, a, b As %Integer) As %String
{
 s n=b-a if n< 0  {s n=n*(- 1 )}
 //--
 s t=##class(TEO.Train).SIntR(Train,a,a, 0 )
 s FK = Train.Serie.Tag.GetAt(a)
 s Fa1=t*FK*Train.Serie.EnergyKoef* 0 . 002725 
 //--
 s t=##class(TEO.Train).SIntR(Train,a,b, 0 )
 s FK = Train.Serie.Tag.GetAt(b)
 s Fa2=t*FK*Train.Serie.EnergyKoef* 0 . 002725 
 //--
 s v=a+ 1 
 s Sa =  0 
 for i= 2 : 1 :n- 1 
 {
     s t=##class(TEO.Train).SIntR(Train,a,v, 0 )
     s FK = Train.Serie.Tag.GetAt(v)
     s Sa=Sa+(t*FK*Train.Serie.EnergyKoef* 0 . 002725 )
     s v = v +  1 
 }
 //--
 s Result=((Fa1+Fa2)/ 2 )+Sa
 kill t,FK,Fa1,Fa2,v,i,n,Sa
 q Result
}

/// Получает данные для разгона/торможения поезда 
/// где ns - номер сегмента, btr - если  0  то разгон если  1  то торможение, a,b - скорости
/// получаем массив где  1 -й элемент - Время,  2 -й - Расстояние,  3 -й - Энергия,  4 -й - Скорость
Method Eval(ns, btr, a, b As %Integer) As %ListOfDataTypes
{
 //константа внимания
 //lvn= 0 . 067 ;
 // час 
 s tvn= 0 . 05 / 60   
 // ошибка движения
 //losh= 0 . 2 ;
 s tosh= 0 . 15 / 60 
 if b>..Serie.MaxSpeed {s b=..Serie.MaxSpeed}
 S Result=##class(%ListOfDataTypes).%New()   
 if (btr= 1 )
 {
    // Время - T
    Do Result.Insert($Number(##class(TEO.Train).SIntT(##this,a,b, 0 ), 4 ))
    // Расстояние - S
    Do Result.Insert($Number(##class(TEO.Train).SIntT(##this,a,b, 1 )+(tvn*a)+(tosh*b), 4 ))
    //Result.A:= 0 ;
    Do Result.Insert( 0 )
    //Result.V:=b;
    Do Result.Insert(b)
 }
 else {
    // Время - T
    Do Result.Insert($Number(##class(TEO.Train).SIntR(##this,a,b, 0 ), 4 ))
    // Расстояние - S
    Do Result.Insert($Number(##class(TEO.Train).SIntR(##this,a,b, 1 ), 4 ))
    //Result.A:= 0 ;
    Do Result.Insert($Number(##class(TEO.Train).SIntA(##this, 0 ,b)-##class(TEO.Train).SIntA(##this, 0 ,a), 2 ))
    //Result.V:=b;
    Do Result.Insert(b)	 
    }
    //for i= 1 : 1 :Result.Count(){w Result.GetAt(i),!}
    //w "Eval: ns="_ns_" btr="_btr_" a="_a_" b="_b_" - T="_Result.GetAt( 1 )_" S="_Result.GetAt( 2 )_" A="_Result.GetAt( 3 )_" V="_Result.GetAt( 4 ),!
    q Result
}
...
Рейтинг: 0 / 0
Как ускорить работы метода в классе?
    #34834368
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Такие экзекюты однозначно пихать в программки и потом запускать.
----------
Cache for Windows NT (Intel) 5.0.20 (Build 6305) Fri Sep 16 2005 11:54:10 EDT
...
Рейтинг: 0 / 0
Как ускорить работы метода в классе?
    #34834454
Alexey Maslov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да что Вы, право, какая генерация программок... Здесь, ИМХО, незнание основ... Вот, например:
Код: plaintext
1.
2.
3.
4.
 XECUTE "Set y="_Train.q0_" Set x="_a_" Set ^U="_Train.Type.W.GetAt( 1 )
 s W1=^U
 XECUTE "Set y="_Train.q0_" Set x="_a_" Set ^U="_Train.Type.W.GetAt( 2 )
 s W2=^U
Глобал ^U используется для хранения промежуточного результата (и больше ни для чего). y и x присваиваются дважды. Да и Xecutы не нужны. Такой код делает то же самое, но многократно быстрее:
Код: plaintext
1.
2.
 Set W1=Train.Type.W.GetAt( 1 )
 Set y=Train.q0,x=a,W2=Train.Type.W.GetAt( 2 )
Так что, уважаемый Dysan, изучайте язык :), убирайте ненужные ^U и Xecutы, а потом уже делайте выводы о производительности.
...
Рейтинг: 0 / 0
Как ускорить работы метода в классе?
    #34834458
NoGot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
То что интерпретатору далеко до компилятора, это верно подметили, к тому же Xecute очень долгий. А вообще, в Cache как я понял с математикой и вычислениями не очень, это ведь все-таки в первую очередь БД... Так что могу посоветовать писать длл и цеплять. Оптимизация тут если и поможет, то не намного...
...
Рейтинг: 0 / 0
Как ускорить работы метода в классе?
    #34834557
Dysan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alexey MaslovДа что Вы, право, какая генерация программок... Здесь, ИМХО, незнание основ... Вот, например:
Код: plaintext
1.
2.
3.
4.
 XECUTE "Set y="_Train.q0_" Set x="_a_" Set ^U="_Train.Type.W.GetAt( 1 )
 s W1=^U
 XECUTE "Set y="_Train.q0_" Set x="_a_" Set ^U="_Train.Type.W.GetAt( 2 )
 s W2=^U
Глобал ^U используется для хранения промежуточного результата (и больше ни для чего). y и x присваиваются дважды. Да и Xecutы не нужны. Такой код делает то же самое, но многократно быстрее:
Код: plaintext
1.
2.
 Set W1=Train.Type.W.GetAt( 1 )
 Set y=Train.q0,x=a,W2=Train.Type.W.GetAt( 2 )
Так что, уважаемый Dysan, изучайте язык :), убирайте ненужные ^U и Xecutы, а потом уже делайте выводы о производительности.
Если бы было всё так просто!
я же тут не просто присвоение делаю! Дело в том что в переменной Train.Type.W.GetAt(1) которую я присваиваю ^U это не просто значение! это функция записаная в текстовом виде примерно такого содержания 1+2*x^y+3*x^(2*y)+ и т.д. т.е. это полином.
От того и XECUTE используеться, а глобал ^U ну так для контроля и отладки.

Меня теперь больше интерисует стоит ли связывать с переписыванием всего в int программу
или лучше сразу начать делать на стороннем языке? отсюда еще один вопрос
Кто-нибуть пробовал .Net подключать из Cache и насколько это дас прирост производительности.
Или всё таки не испытывать судьбу и на С++ ???
...
Рейтинг: 0 / 0
Как ускорить работы метода в классе?
    #34834659
Alexey Maslov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно отпрофилировать программу (Do ^%SYS.MONLBL) и попытаться выявить критический участок, чтобы заняться оптимизацией именно его. Только уберите сначала ^U (а то он будет портить статистику).
...
Рейтинг: 0 / 0
Как ускорить работы метода в классе?
    #34834663
Фотография ну я
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dysanя же тут не просто присвоение делаю! Дело в том что в переменной Train.Type.W.GetAt(1) которую я присваиваю ^U это не просто значение! это функция записаная в текстовом виде примерно такого содержания 1+2*x^y+3*x^(2*y)+ и т.д. т.е. это полином.
От того и XECUTE используеться, а глобал ^U ну так для контроля и отладки.
Что мешает сгенерить целиком INT код?
...
Рейтинг: 0 / 0
Как ускорить работы метода в классе?
    #34834795
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DysanМеня теперь больше интерисует стоит ли связывать с переписыванием всего в int программу
или лучше сразу начать делать на стороннем языке?
На каком языке писать - дело конечно хозяйское... Но выбрав язык нужно использовать его возможности на 100%.
...
Рейтинг: 0 / 0
Как ускорить работы метода в классе?
    #34837803
VadimF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, для хранения промежуточных данных в последних версиях Cache' появились Process Private Globals .

Посмотрите еще материалы школы по увеличению производительности.
Увеличение производительности приложений на Caché и Ensemble. , упражнения .

Вадим
...
Рейтинг: 0 / 0
Как ускорить работы метода в классе?
    #34838065
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А для решения этой задачи обязательно использовать Cache?
Задача привязана к каким-то даннным в базе?
Этих данных сотни мега-гибагайт?

Уж больно несответвующим выглядит инструмент
...
Рейтинг: 0 / 0
Как ускорить работы метода в классе?
    #34839449
Dysan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
за ссылки спасибо прочту.

Блок А.Н.А для решения этой задачи обязательно использовать Cache?
Задача привязана к каким-то даннным в базе?
Этих данных сотни мега-гибагайт?

Уж больно несответвующим выглядит инструмент

Да. Задача привязана именно этой базе. Для решения задачи не обязательно использовать
Cache но я подумал раз в БД есть язык и такие удобные ООП возможности
то почему бы ими не воспользоваться. Однако не совсем помогло.

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


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