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

Хоть бы пример чтоли привел того что у тебя есть...
----------
Cache for Windows NT (Intel) 5.0.20 (Build 6305) Fri Sep 16 2005 11:54:10 EDT
...
Рейтинг: 0 / 0
28.09.2007, 10:25
    #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
28.09.2007, 13:04
    #34834368
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ускорить работы метода в классе?
Такие экзекюты однозначно пихать в программки и потом запускать.
----------
Cache for Windows NT (Intel) 5.0.20 (Build 6305) Fri Sep 16 2005 11:54:10 EDT
...
Рейтинг: 0 / 0
28.09.2007, 13:21
    #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
28.09.2007, 13:21
    #34834458
NoGot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ускорить работы метода в классе?
То что интерпретатору далеко до компилятора, это верно подметили, к тому же Xecute очень долгий. А вообще, в Cache как я понял с математикой и вычислениями не очень, это ведь все-таки в первую очередь БД... Так что могу посоветовать писать длл и цеплять. Оптимизация тут если и поможет, то не намного...
...
Рейтинг: 0 / 0
28.09.2007, 13:40
    #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
28.09.2007, 13:56
    #34834659
Alexey Maslov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ускорить работы метода в классе?
Можно отпрофилировать программу (Do ^%SYS.MONLBL) и попытаться выявить критический участок, чтобы заняться оптимизацией именно его. Только уберите сначала ^U (а то он будет портить статистику).
...
Рейтинг: 0 / 0
28.09.2007, 13:57
    #34834663
ну я
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ускорить работы метода в классе?
Dysanя же тут не просто присвоение делаю! Дело в том что в переменной Train.Type.W.GetAt(1) которую я присваиваю ^U это не просто значение! это функция записаная в текстовом виде примерно такого содержания 1+2*x^y+3*x^(2*y)+ и т.д. т.е. это полином.
От того и XECUTE используеться, а глобал ^U ну так для контроля и отладки.
Что мешает сгенерить целиком INT код?
...
Рейтинг: 0 / 0
28.09.2007, 14:21
    #34834795
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ускорить работы метода в классе?
DysanМеня теперь больше интерисует стоит ли связывать с переписыванием всего в int программу
или лучше сразу начать делать на стороннем языке?
На каком языке писать - дело конечно хозяйское... Но выбрав язык нужно использовать его возможности на 100%.
...
Рейтинг: 0 / 0
01.10.2007, 11:21
    #34837803
VadimF
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ускорить работы метода в классе?
Кстати, для хранения промежуточных данных в последних версиях Cache' появились Process Private Globals .

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

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

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

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

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

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

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


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