Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Из строки в массив(COS) / 25 сообщений из 34, страница 1 из 2
08.04.2009, 11:38
    #35919353
Гость68
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Из строки в массив(COS)
Есь строки "1,2,3,4" "A1,A2,4,...,DDDD.." Есть ли возможность их сразу в массив в COS. В бейсике сразу можно
Код: plaintext
1.
2.
3.
ARR=Split(STROKA,",")
For i=0 To Ubound(ARR)
     ^GL(ii,i)=ARR(i)
Next
Если нет то как? Может кто уже сталкивался
...
Рейтинг: 0 / 0
08.04.2009, 11:47
    #35919388
Александр Коблов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Из строки в массив(COS)
Гость68,

Нельзя так на косе, цикл нужно писать
Код: plaintext
1.
2.
3.
 set a="a,b,c,d,ef"
 for i=1:1:$LENGTH(a,",") {
    set ARR(i)=$PIECE(a,",",i)
 }
...
Рейтинг: 0 / 0
08.04.2009, 11:57
    #35919425
Leron
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Из строки в массив(COS)
Гость68,

Можно использовать ф-ию $listfromstring, которая возвращает список.
Код: plaintext
1.
2.
 set a="a,b,c,d,ef"
 set list=$listfromstring(a,",")
 for i=1:1:$ll(list) w $lg(list,i),!
...
Рейтинг: 0 / 0
08.04.2009, 12:04
    #35919464
servit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Из строки в массив(COS)
Код: plaintext
1.
2.
3.
4.
5.
 SET list=$LISTFROMSTRING(STROKA,",")
 SET ptr=0,i=0
 WHILE $LISTNEXT(list,ptr,value) {
  SET ARR(i)=value
  SET i=i+1
 }
...
Рейтинг: 0 / 0
08.04.2009, 12:16
    #35919517
Гость68
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Из строки в массив(COS)
Всем спасибо. Дорого каждое мгновение, как Вы думаете COS будет быстрей чем Cache Basic?
Судя по коду будет несколько раз работать ф-ия $P. Хотя с другой стороны Cache Basic конвертится в тот же COS


В 5.0 не нашел $listfromstring
...
Рейтинг: 0 / 0
08.04.2009, 12:28
    #35919586
Александр Коблов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Из строки в массив(COS)
Гость68Всем спасибо. Дорого каждое мгновение, как Вы думаете COS будет быстрей чем Cache Basic?
Судя по коду будет несколько раз работать ф-ия $P. Хотя с другой стороны Cache Basic конвертится в тот же COS


В 5.0 не нашел $listfromstringCOS, наверное, быстрее, а так -- $zhorolog и ^%MONLBL вам в помощь.
$listfromstring в 5.1 появилась.
...
Рейтинг: 0 / 0
08.04.2009, 13:07
    #35919736
servit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Из строки в массив(COS)
По поводу производительности:
$listnext (материал со Школы Инноваций InterSystems 2007 , слайд 32)
GetNext для коллекций (материал с DevCon 2009 , стр. 16)
...
Рейтинг: 0 / 0
08.04.2009, 13:15
    #35919764
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Из строки в массив(COS)
Так что? Быстрее будет работать через $LISTFROMSTRING() и $LISTNEXT() чем просто разбирать строку через $p()?
----------
Cache for Windows (x86-32) 2007.1.3 (Build 607) Wed Oct 17 2007 02:12:09 EDT
...
Рейтинг: 0 / 0
08.04.2009, 13:51
    #35919913
Alexey Maslov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Из строки в массив(COS)
Однозначно быстрее, можно даже не мерить. Любая адекватная замена нескольких вызовов встроенных функций на один всегда дает выигрыш.
Зато не будет работать в 5.0.
Я когда-то, находясь на распутье между версиями, накропал пару макросов, которые в зависимости от версии Cache транслируются в $listfromstr или в цикл с $p(). Если кому интересно, могу выложить.
Cache Basic, ИМХО, не должен проигрывать COS по скорости (если, конечно, удается использовать аналогичные языковые конструкции): транслируется-то они по любому в *.OBJ того же формата.
...
Рейтинг: 0 / 0
08.04.2009, 13:52
    #35919918
servit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Из строки в массив(COS)
У меня быстрее в ~ 26 раз.
Но нужно учитывать две вещи:
1) $lfs,$listnext отсутствуют в старых версиях Caché;
2) размер строки и размер той же строки в виде списка отличаются.
...
Рейтинг: 0 / 0
08.04.2009, 14:00
    #35919959
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Из строки в массив(COS)
Благо у нас клиентура скоро вся перейдет на 2007.*...
----------
Cache for Windows (x86-32) 2007.1.3 (Build 607) Wed Oct 17 2007 02:12:09 EDT
...
Рейтинг: 0 / 0
08.04.2009, 15:10
    #35920277
Александр Коблов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Из строки в массив(COS)
$listnext быстрее если писать с for
Код: plaintext
1.
2.
3.
4.
5.
6.
 S list=$LFS(STROKA,",")
 S ptr=0
 f i=1:1 {
  q:$LISTNEXT(list,ptr,value) 
  S ARR(i)=value
 }
 
С while медленее, потому что приходится отдельно i считать
...
Рейтинг: 0 / 0
08.04.2009, 17:26
    #35920883
servit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Из строки в массив(COS)
Пример взял из документации. Спасибо за совет.
Тогда скорость $listnext над $p возрастает с ~ 400 раз до ~ 500.
Код
Код: 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.
  ...
  set N=10000
  set stroka=""
  for i=1:1:N-1 {
    set stroka=stroka_"1,"
  }
  set stroka=stroka_"1"
  
  set t=$zhorolog
  set list=$listfromstring(stroka,",")
  set ptr=0
  for  {
    quit:'$listnext(list,ptr,value)
  }
  set t1=$zhorolog-t
  write "(t1) Время с $listnext = ",?25,t1," c.",!

  set t=$zhorolog
  for i=1:1:N {
    set value=$piece(stroka,",",i)
  }
  set t2=$zhorolog-t
  write "(t2) Время с $piece = ",?25,t2," c.",!

  write "t2/t1 = ",?25,t2/t1,!
  ...
PS: только вместо
Код: plaintext
q:$listnext(list,ptr,value)
надо
Код: plaintext
q:'$listnext(list,ptr,value)
...
Рейтинг: 0 / 0
08.04.2009, 19:10
    #35921144
Александр Коблов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Из строки в массив(COS)
servit,

Точно!!
Код: plaintext
q:'$listnext(list,ptr,value)
То-то я смотрю, у меня такой прирост в скорости :-)
...
Рейтинг: 0 / 0
09.04.2009, 11:52
    #35922191
Alexey Maslov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Из строки в массив(COS)
Коллеги, а вы не забыли, что надо еще и массив заполнять? :) а операция это довольно-таки затратная... Вариант с $p() отбросим сразу как заведомо проигрышный.
См:
Код: 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.
  set N=10000
  set stroka=""
  for i=1:1:N-1 {
    set stroka=stroka_"1,"
  }
  set stroka=stroka_"1"
  k arr
  set t=$zhorolog
  set list=$listfromstring(stroka,",")
  set ptr=0
  for i=1:1 {
    quit:'$listnext(list,ptr,value)
    s arr(i)=value
  }
  set t1=$zhorolog-t
  write "(t1) Время с $listnext = ",?25,t1," c.",!
  k arr
  set t=$zhorolog,p1=1,stroka=stroka_","
  for i=1:1 {
    set p2=$f(stroka,",",p1) q:p2=0
    set value=$e(stroka,p1,p2-2)
    set arr(i)=value
    set p1=p2
  }
  set t3=$zhorolog-t
  write "(t3) Время с $f/$e = ",?25,t3," c.",!
  write "t3/t1 = ",?25,t3/t1,!
У меня получилось t3/t1 = 1.02-1.03
P.S. Тестировал на Intel P4, Cache for Windows (x86-32) 2008.2.1 (Build 902)) и
на AMD64, Cache for UNIX (Red Hat Enterprise Linux for x86-64, 2008.2.1 (Build 902)).
...
Рейтинг: 0 / 0
09.04.2009, 13:02
    #35922446
servit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Из строки в массив(COS)
Конечно, наличие массива в цикле заметно увеличивает время выполнения. Отсюда и цифра 26 в моём посте выше.

PS: нет предела совершенству.
...
Рейтинг: 0 / 0
09.04.2009, 13:44
    #35922606
Alexey Maslov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Из строки в массив(COS)
Без массива получается t3/t1 ~ 1.5, что все равно неплохо по сравнению с $piece().
...
Рейтинг: 0 / 0
09.04.2009, 14:26
    #35922787
DAiMor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Из строки в массив(COS)
непонятно что вас заставляет использовать $listnext
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
  set t=$zhorolog
  set list=$listfromstring(stroka,",")
  set ptr=0
  for i=1:1:$ll(list) {
    s arr(i)=value
  }
  set t2=$zhorolog-t
  write "(t2) Время с $ll = ",?25,t2," c.",!
ведь c использованием $listlength все равно быстрее
автор
Код: plaintext
1.
2.
(t1) Время с $listnext = .016338 c.
(t2) Время с $ll =       .015735 c.
(t3) Время с $f/$e =     .016932 c.
...
Рейтинг: 0 / 0
09.04.2009, 14:56
    #35922906
servit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Из строки в массив(COS)
Код: plaintext
1.
2.
 for i=1:1:$ll(list) {
  s arr(i)=value
 }
Здесь value никогда не меняется и неизвестно чему равно.
...
Рейтинг: 0 / 0
09.04.2009, 15:09
    #35922954
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Из строки в массив(COS)
Наверное имелось в виду
Код: plaintext
1.
2.
 for i=1:1:$ll(list) {
  s arr(i)=LISTGET(list,i)
 }
----------
Cache for Windows (x86-32) 2007.1.3 (Build 607) Wed Oct 17 2007 02:12:09 EDT
...
Рейтинг: 0 / 0
09.04.2009, 15:10
    #35922955
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Из строки в массив(COS)
Даже
Код: plaintext
1.
2.
 for i=1:1:$ll(list) {
  s arr(i)=$LISTGET(list,i)
 }

----------
Cache for Windows (x86-32) 2007.1.3 (Build 607) Wed Oct 17 2007 02:12:09 EDT
...
Рейтинг: 0 / 0
09.04.2009, 15:19
    #35922978
Alexey Maslov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Из строки в массив(COS)
Продолжая "common code":
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
 ...
  k arr
  set t=$zhorolog
  set list=$listfromstring(stroka,",")
  set ptr=0
  for i=1:1:$ll(list) {
    s arr(i)=$lg(list,i)
  }
  set t4=$zhorolog-t
  write "(t4) Время с $ll/$lg = ",?25,t4," c.",!
  write "t4/t1 = ",?25,t4/t1,!
Получаем самый медленный вариант из предложенных:
Код: plaintext
1.
2.
3.
4.
5.
6.
(t1) Время с $listnext = .033437 c.
(t2) Время с $piece =    .146446 c.
t2/t1 =                  4.37975894966653707
(t3) Время с $f/$e =     .033883 c.
t3/t1 =                  1.013338517211472321
(t4) Время с $ll/$lg =   .157729 c.
t4/t1 =                  4.71719950952537608
...
Рейтинг: 0 / 0
09.04.2009, 16:10
    #35923159
DAiMor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Из строки в массив(COS)
servit
Код: plaintext
1.
2.
 for i=1:1:$ll(list) {
  s arr(i)=value
 }
Здесь value никогда не меняется и неизвестно чему равно.да зашпарился маленько
...
Рейтинг: 0 / 0
09.04.2009, 16:26
    #35923223
Alexey Maslov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Из строки в массив(COS)
На самом деле такие отклонения, как t3 - t1, могут быть в пределах погрешности. Но на 500 прогонах у меня получился практически тот же результат: у t1 ($listnext) небольшой, но устойчивый выигрыш: порядка 1% в Windows/x32 и ~ 3% - в Linux/x64.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
22.07.2010, 02:45
    #36753568
CEH
CEH
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Из строки в массив(COS)
Код:
Код: 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.
  ;Set test string
  set zt="~"
  set N=10000
  set string=""
  for i=1:1:N-1 {
    set:i'=5000 string=string_"1~"
    set:i=5000 string=string_"A~"
  }
  set string=string_"B"
  
  ; Test ListFromString (A CLOSE #2 IN SPEED)
  k arr,list
  set t=$zhorolog
  set list=$listfromstring(string,zt)
  set ptr=0
  for i=1:1 {
    quit:'$listnext(list,ptr,value)
    s arr(i)=value
  }
  
  set t1=$zhorolog-t
  write "(t1) Time using $listnext = ",?25,t1," c.",!
  
  ; Test ListFromString - Get specific element
  k arr,value,list
  set t=$zhorolog
  set list=$listfromstring(string,zt)
  set ptr=0
  for i=1:1:5000 {
    quit:'$listnext(list,ptr,value)
  }
  write "A=",value
  k arr
  set t11=$zhorolog-t
  write "(t1.1) Time using $listnext element #5000 = ",?25,t11," c.",!
  write !
    
  ; Test List Get (ONLY SLIGHTLY FASTER THAN $PIECE)
  k arr,list
  set t=$zhorolog
  set list=$listfromstring(string,zt)
  set len=$LL(list)
  for i=1:1:len {
    set value=$LG(list,i)
    set arr(i)=value
  }
  set t2=$zhorolog-t
  write "(t2) Time using $listget = ",?25,t2," c.",!
  
  ; Test List Get for specific element
  k arr,value
  set t=$zhorolog
  set list=$listfromstring(string,zt)
  set value=$LG(list,5000)
  write "A=",value
  set t21=$zhorolog-t
  write "(t2.1) Time using $listget element #5000 = ",?25,t21," c.",!
  write !
  
  ; Test $Piece  (SLOWEST OPTION)
  k arr
  set t=$zhorolog
  set l=$l(string,zt)
  for i=1:1:l {
    set value=$p(string,"~",i)
    set arr(i)=value
  }
  set t3=$zhorolog-t
  write "(t3) Time using $p = ",?25,t3," c.",!
  ;write "t3/t1 = ",?25,t3/t1,"  -  [",t3/t1*100,"%]",!
  
  
  ; Test $Piece For specific element  (FASTEST BY FAR!)
  k arr,value
  set t=$zhorolog
  set value=$p(string,zt,5000)
  write "A=",value
  set t31=$zhorolog-t
  write "(t3.1) Time using $p for specific element #5000 = ",?25,t31," c.",!
  ;write "t31/t11 = ",?25,t31/t11,"  -  [",t31/t11*100,"%]",!
  write !
  
  ; Test $Find-$Extract (FASTEST!!!)
  k arr
  set t=$zhorolog
  set p1=1       ; starting pos
  set string=string_"~"    ; add delimiter to extract the last piece
  for i=1:1 {
    set p2=$f(string,"~",p1) q:p2=0
    set value=$e(string,p1,p2-2)
    set arr(i)=value
    set p1=p2
  }
  set t5=$zhorolog-t
  write "(t5) Time using $f/$e = ",?25,t5," c.",!
  ;write "t5/t1 = ",?25,t5/t1,"  -  [",t5/t1*100,"%]",!
  
  
  ; Test $Find-$Extract for specific element
  k arr,value
  set t=$zhorolog
  set p1=1       ; starting pos
  set string=string_"~"    ; add delimiter to extract the last piece
  for i=1:1 {
    set p2=$f(string,"~",p1) q:p2=0
    i i=5000 s value=$e(string,p1,p2-2) q
    set p1=p2
  }
  write "A=",value
  set t51=$zhorolog-t
  write "(t5.1) Time using $f/$e to get element #5000 = ",?25,t51," c.",!
  ;write "t5.1/t1 = ",?25,t51/t1,"  -  [",t51/t1*100,"%]",!
  write !
  quit
====================================================================Результат:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
(t1) Time using $listnext = .037694 c.
A=A(t1.1) Time using $listnext element #5000 = .001132 c.
 
(t2) Time using $listget = .192924 c.
A=A(t2.1) Time using $listget element #5000 = .000356 c.
 
(t3) Time using $p =     .238265 c.
A=A(t3.1) Time using $p for specific element #5000 = .000048 c.
 
(t5) Time using $f/$e =  .044207 c.
A=A(t5.1) Time using $f/$e to get element #5000 = .001112 c.
=====================================================================
Вывод: нечего лопатой торт резать
...
Рейтинг: 0 / 0
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Из строки в массив(COS) / 25 сообщений из 34, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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