powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Из строки в массив(COS)
25 сообщений из 34, страница 1 из 2
Из строки в массив(COS)
    #35919353
Гость68
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есь строки "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
Из строки в массив(COS)
    #35919388
Александр Коблов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гость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
Из строки в массив(COS)
    #35919425
Leron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Гость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
Из строки в массив(COS)
    #35919464
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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
Из строки в массив(COS)
    #35919517
Гость68
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем спасибо. Дорого каждое мгновение, как Вы думаете COS будет быстрей чем Cache Basic?
Судя по коду будет несколько раз работать ф-ия $P. Хотя с другой стороны Cache Basic конвертится в тот же COS


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


В 5.0 не нашел $listfromstringCOS, наверное, быстрее, а так -- $zhorolog и ^%MONLBL вам в помощь.
$listfromstring в 5.1 появилась.
...
Рейтинг: 0 / 0
Из строки в массив(COS)
    #35919736
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По поводу производительности:
$listnext (материал со Школы Инноваций InterSystems 2007 , слайд 32)
GetNext для коллекций (материал с DevCon 2009 , стр. 16)
...
Рейтинг: 0 / 0
Из строки в массив(COS)
    #35919764
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так что? Быстрее будет работать через $LISTFROMSTRING() и $LISTNEXT() чем просто разбирать строку через $p()?
----------
Cache for Windows (x86-32) 2007.1.3 (Build 607) Wed Oct 17 2007 02:12:09 EDT
...
Рейтинг: 0 / 0
Из строки в массив(COS)
    #35919913
Alexey Maslov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Однозначно быстрее, можно даже не мерить. Любая адекватная замена нескольких вызовов встроенных функций на один всегда дает выигрыш.
Зато не будет работать в 5.0.
Я когда-то, находясь на распутье между версиями, накропал пару макросов, которые в зависимости от версии Cache транслируются в $listfromstr или в цикл с $p(). Если кому интересно, могу выложить.
Cache Basic, ИМХО, не должен проигрывать COS по скорости (если, конечно, удается использовать аналогичные языковые конструкции): транслируется-то они по любому в *.OBJ того же формата.
...
Рейтинг: 0 / 0
Из строки в массив(COS)
    #35919918
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня быстрее в ~ 26 раз.
Но нужно учитывать две вещи:
1) $lfs,$listnext отсутствуют в старых версиях Caché;
2) размер строки и размер той же строки в виде списка отличаются.
...
Рейтинг: 0 / 0
Из строки в массив(COS)
    #35919959
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Благо у нас клиентура скоро вся перейдет на 2007.*...
----------
Cache for Windows (x86-32) 2007.1.3 (Build 607) Wed Oct 17 2007 02:12:09 EDT
...
Рейтинг: 0 / 0
Из строки в массив(COS)
    #35920277
Александр Коблов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
$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
Из строки в массив(COS)
    #35920883
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пример взял из документации. Спасибо за совет.
Тогда скорость $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
Из строки в массив(COS)
    #35921144
Александр Коблов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
servit,

Точно!!
Код: plaintext
q:'$listnext(list,ptr,value)
То-то я смотрю, у меня такой прирост в скорости :-)
...
Рейтинг: 0 / 0
Из строки в массив(COS)
    #35922191
Alexey Maslov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Коллеги, а вы не забыли, что надо еще и массив заполнять? :) а операция это довольно-таки затратная... Вариант с $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
Из строки в массив(COS)
    #35922446
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Конечно, наличие массива в цикле заметно увеличивает время выполнения. Отсюда и цифра 26 в моём посте выше.

PS: нет предела совершенству.
...
Рейтинг: 0 / 0
Из строки в массив(COS)
    #35922606
Alexey Maslov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Без массива получается t3/t1 ~ 1.5, что все равно неплохо по сравнению с $piece().
...
Рейтинг: 0 / 0
Из строки в массив(COS)
    #35922787
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
непонятно что вас заставляет использовать $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
Из строки в массив(COS)
    #35922906
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
 for i=1:1:$ll(list) {
  s arr(i)=value
 }
Здесь value никогда не меняется и неизвестно чему равно.
...
Рейтинг: 0 / 0
Из строки в массив(COS)
    #35922954
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наверное имелось в виду
Код: 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
Из строки в массив(COS)
    #35922955
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Даже
Код: 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
Из строки в массив(COS)
    #35922978
Alexey Maslov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Продолжая "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
Из строки в массив(COS)
    #35923159
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
servit
Код: plaintext
1.
2.
 for i=1:1:$ll(list) {
  s arr(i)=value
 }
Здесь value никогда не меняется и неизвестно чему равно.да зашпарился маленько
...
Рейтинг: 0 / 0
Из строки в массив(COS)
    #35923223
Alexey Maslov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На самом деле такие отклонения, как t3 - t1, могут быть в пределах погрешности. Но на 500 прогонах у меня получился практически тот же результат: у t1 ($listnext) небольшой, но устойчивый выигрыш: порядка 1% в Windows/x32 и ~ 3% - в Linux/x64.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Из строки в массив(COS)
    #36753568
CEH
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код:
Код: 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
25 сообщений из 34, страница 1 из 2
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Из строки в массив(COS)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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