powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Из строки в массив(COS)
34 сообщений из 34, показаны все 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
Из строки в массив(COS)
    #36753644
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
все же зря вы не оформляете нормально сообщения

теперь по существу
первый тест, тормозит из-за использования FOR, не используйте его если вам нужна производительность, используйте while, это касается всех ваших тестов

$piece тоже медленный, его использование также не рекомендуется

в общем не совсем понятно что вы тестировали и опять же, не вижу того что это средние показатели
...
Рейтинг: 0 / 0
Из строки в массив(COS)
    #36753858
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изменённый код
Код: 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.
  ;-- Set test string
  set tab=85
  set zt="~"
  set N=10000
  set string=""
  for i=1:1:N-1 {
    set string=$s(i=5000:string_"A~",1:string_"1~")
    set arr(i)=""
  }
  set string=string_"B"
  set list=$listfromstring(string,zt)

  ;-- Test ListFromString (A CLOSE #2 IN SPEED)
  set value=""
  set ptr=0
  set t=$zhorolog
  for i=1:1 {
    q:'$listnext(list,ptr,value)
    set arr(i)=value
  }
  write "[Тест №1] Время прохода по всему списку, используя $listnext = ",?tab,$zhorolog-t," c.",!

  ;-- Test ListFromString - Get specific element
  set value=""
  set ptr=0
  set t=$zhorolog
  for i=1:1:5000 quit:'$listnext(list,ptr,value)
  write "A=",value
  write " [Тест №1.1] Время получения 5000-го элемента, используя $listnext = ",?tab,$zhorolog-t," c.",!,!

  ;-- Test List Get (ONLY SLIGHTLY FASTER THAN $PIECE)
  set t=$zhorolog
  for i=1:1:N set arr(i)=$LG(list,i)
  write "[Тест №2] Время прохода по всему списку, используя $listget = ",?tab,$zhorolog-t," c.",!

  ;-- Test List Get for specific element
  set t=$zhorolog
  write "A=",$LG(list,5000)
  write " [Тест №2.1] Время получения 5000-го элемента, используя $listget = ",?tab,$zhorolog-t," c.",!,!

  ;-- Test $Piece (SLOWEST OPTION)
  set t=$zhorolog
  for i=1:1:N set arr(i)=$p(string,"~",i)
  write "[Тест №3] Время прохода по всему списку, используя $p = ",?tab,$zhorolog-t," c.",!

  set str=string
  set t=$zhorolog
  for i=1:1:N {
    set arr(i)=$p(str,zt,1,1)
    set str=$p(str,zt,2,N+1-i)
  }
  write "[Тест №3.0] Время прохода по всему списку, используя $p с сужением области поиска = ",?tab,$zhorolog-t," c.",!
  
  ;-- Test $Piece For specific element (FASTEST BY FAR!)
  set t=$zhorolog
  write "A=",$p(string,zt,5000)
  write " [Тест №3.1] Время получения 5000-го элемента, используя $p = ",?tab,$zhorolog-t," c.",!,!

  ;-- Test $Find-$Extract (FASTEST!!!)
  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 arr(i)=$e(string,p1,p2-2)
    set p1=p2
  }
  write "[Тест №5] Время прохода по всему списку, используя $f/$e = ",?tab,$zhorolog-t," c.",!
  
  ;-- Test $Find-$Extract for specific element
  set value=""
  set p1=1 ; starting pos
  ;-- set string=string_"~" ; add delimiter to extract the last piece
  set t=$zhorolog
  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
  write " [Тест №5.1] Время получения 5000-го элемента, используя $f/$e = ",?tab,$zhorolog-t," c.",!,!
Результаты:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
[Тест №1] Время прохода по всему списку, используя $listnext =                       .001316 c.
A=A [Тест №1.1] Время получения 5000-го элемента, используя $listnext =              .000285 c.
 
[Тест №2] Время прохода по всему списку, используя $listget =                        .07716 c.
A=A [Тест №2.1] Время получения 5000-го элемента, используя $listget =               .000018 c.
 
[Тест №3] Время прохода по всему списку, используя $p =                              .338546 c.
[Тест №3.0] Время прохода по всему списку, используя $p с сужением области поиска =  .138815 c.
A=A [Тест №3.1] Время получения 5000-го элемента, используя $p =                     .000031 c.
 
[Тест №5] Время прохода по всему списку, используя $f/$e =                           .001623 c.
A=A [Тест №5.1] Время получения 5000-го элемента, используя $f/$e =                  .000364 c.
Выводы:
1) почему [1] < [2] объяснялось выше;
2) [1.1] > [2.1], [3.1] < [5.1] - здравый смысл;
3) [3] > [5], так как в [5] область поиска с каждой итерацией сужается;
4) следует разделять функции для быстрого получения единичного элемента и для быстрого прохода по всем элементам.
...
Рейтинг: 0 / 0
Из строки в массив(COS)
    #36754452
CEH
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
благодарю за ответ
(1) согласен. следующий адресс даже не переводится.

(2) здравый есть. но кто знает как на код взглянуть?

(3) да

(4) да, но это зависит от содержания даты. а как её знать до процесса?
...
Рейтинг: 0 / 0
Из строки в массив(COS)
    #36754483
CEH
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
(1) попробую For <> While
(2) кто рекомендует? где?
(3) если строки не монолитны содержанием за чем всё читать?
...
Рейтинг: 0 / 0
Из строки в массив(COS)
    #36754618
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вариант с for у меня оказался чуть быстрее, чем с while , поэтому я привёл код с for .

To CEH
Попробуйте следующий пример:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
  ...
  set t=$zhorolog
  for i=1:1:N set arr(i)=$p(string,zt,1)
  write "[Тест №1] Время получения 1-го элемента в цикле, используя $p = ",?tab,$zhorolog-t," c.",!
  
  set t=$zhorolog
  for i=1:1:N set arr(i)=$p(string,zt,N)
  write "[Тест №2] Время получения 10000-го элемента в цикле, используя $p = ",?tab,$zhorolog-t," c.",!
  
  set t=$zhorolog
  for i=1:1:N set arr(i)=$f(string,zt,1)
  write "[Тест №3] Время нахождения 1-ой ~  в цикле, используя $f = ",?tab,$zhorolog-t," c.",!
  
  set t=$zhorolog
  for i=1:1:N set arr(i)=$f(string,zt,N-2)
  write "[Тест №4] Время нахождения последней ~ в цикле, используя $f = ",?tab,$zhorolog-t," c.",!
  ...
CEH(4) да, но это зависит от содержания даты. а как её знать до процесса?О какой дате идёт речь?
...
Рейтинг: 0 / 0
Из строки в массив(COS)
    #36755872
MX-9
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEHблагодарю за ответ
(1) согласен. следующий адресс даже не переводится.

(2) здравый есть. но кто знает как на код взглянуть?

(3) да

(4) да, но это зависит от содержания даты. а как её знать до процесса?

CEH

возможно Вам лучше писать Ваши сообщения на английском
и ниже добавлять перевод на русский

иначе не всегда понятно
...
Рейтинг: 0 / 0
Из строки в массив(COS)
    #36762950
Sergei Obrastsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прошу прощения за археологию, но как-то не удержался :)

DAiMorтеперь по существу
первый тест, тормозит из-за использования FOR, не используйте его если вам нужна производительность, используйте while, это касается всех ваших тестов
Не нужно говорить глупости, FOR всегда будет быстрее WHILE, хотя бы потому,
что WHILE конструируется на уровне p-кода. Внимательнее нужно быть.
В среднем в 3-4 раза FOR будет быстрее, если речь об одной строке. Если речь об
исполняемом блоке, то раза в 2.

P.S. Все нестандартные "примочки" в COS, уровня WHILE, $CASE и т.д., конструируются.
Я полагал, что это общеизвестно. Посему говорить об их "скорости" несерьезно.
$CASE вообще раскладывается на парные $SELECTы, это нечто.
...
Рейтинг: 0 / 0
Из строки в массив(COS)
    #36762973
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хм, ни за что бы не подумал
Код: plaintext
1.
2.
3.
4.
>s h=$zh,i=1  while($i(i)<=1000000){}   w $zh-h
.174184

>s h=$zh  f i=1:1:1000000 {}    w $zh-h
.015947
...
Рейтинг: 0 / 0
Из строки в массив(COS)
    #36763012
Turk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Блок А.Н.Хм, ни за что бы не подумал
Код: plaintext
1.
2.
3.
4.
>s h=$zh,i=1  while($i(i)<=1000000){}   w $zh-h
.174184

>s h=$zh  f i=1:1:1000000 {}    w $zh-h
.015947
Некорректное сравнение. While из вашего примера нужно сравнивать с таким кодом:
Код: plaintext
s h=$zh,i=1  f { q:($i(i)>1000000) }    w $zh-h
А for со счетчиком естественно работает быстрее, так как там задействован регистр процессора.
...
Рейтинг: 0 / 0
34 сообщений из 34, показаны все 2 страниц
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Из строки в массив(COS)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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