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


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