Имя: Пароль:
1C
1C 7.7
v7: Что быстрее работает: Цикл или ВыбратьСтроки()?
,
0 Zhuravlik
 
05.10.11
03:36
Просто столкнулся, как лучше выбирать элементы - из списка, и делать

Для сч = 1 по мойСписок.РазмерСписка() Цикл
   Элемент = мойСписок.ПолучитьЗначение(сч);
КонецЦикла;



или из таблицы значений, методом ВыбратьСтроки()?




тз.ВыбратьСтроки();

Пока тз.ПолучитьСтроку() = 1 Цикл

Элемент = тз.ПолучитьЗначение(тз.НомерСтроки, 1);

КонецЦикла;
1 Zhuravlik
 
05.10.11
03:37
+ в смысле как быстрее...
2 МихаилМ
 
05.10.11
03:50
1 быстрее
3 Zhuravlik
 
05.10.11
03:57
Спасибо) а ссылкой не поделитесь с тестированием? Я искал на инфостарте, но что-то не нашел..
4 DJ Anthon
 
05.10.11
03:59
а самому слабо потестить?
5 Rie
 
05.10.11
04:02
(3) Отладчик. Меню "Отладка". Самый последний пункт.
6 Zhuravlik
 
05.10.11
04:02
(4) если бы было не слабо, я бы тему не создавал)) А так, просто если есть велосипед, зачем его изобретать еще раз?
7 Zhuravlik
 
05.10.11
04:03
(5) отладчиком еще не научился пользоваться...
8 Rie
 
05.10.11
04:06
(7) Тебя с этим поздравить? Или как?
В (5) тебе дана ссылка. Изучай.
9 МихаилМ
 
05.10.11
04:13
это же 1с
а она как обычно врёт в отладчике

используйте
_GetprformanceCounter()

при размере тз более 300 сторок

быстрее выгрузить в списки
чем пользоваться тз.ПолучитьЗначение()
уж больно тормозной.
10 Zhuravlik
 
05.10.11
04:15
(9) я уже начал делать)) Спасибо.
11 strange2007
 
05.10.11
04:27
(9) Зачем???? Разве там точность????? Для точности лучше использовать GetProcessTimes.
12 ЧеловекДуши
 
05.10.11
05:43
Быстрее цикл, т.к. ВЫбратьСтроки, сперва жутко повисает, при очень больших (100000 строк) таблицах.
13 ЧеловекДуши
 
05.10.11
05:45
+ Так же СписокЗначений, работает медленней чем ТаблицаЗначений.
Особенно это заметно на команде "НайтиЗначение"
14 Erhov_egor
 
05.10.11
06:16
1 быстрее точно
15 Chai Nic
 
05.10.11
06:17
(13) Они оба поиск производят последовательным перебором. Для быстрого поиска используйте объект ИндексированнаяТаблица из 1с++
16 ЧеловекДуши
 
05.10.11
06:17
+ Так же ТаблицаЗначений работает медленней Индексированной Таблицы ;)
17 ЧеловекДуши
 
05.10.11
06:18
+(15)Оба или не оба, но СписокЗначений, работает медленней чем ТаблицаЗначений
И это уже доказано ;)
18 Chai Nic
 
05.10.11
06:18
А если таблица/список заведомо небольшие - делайте по критерию максимальной красивости кода. Вам же самим будет легче в дальнейшем..
19 ЧеловекДуши
 
05.10.11
06:18
(0)Теперь можешь делать выводы :)
20 ЧеловекДуши
 
05.10.11
06:19
(18)Если 10 элементов, то нет разницы.
21 ЧеловекДуши
 
05.10.11
06:19
+ Вернее ты её незаметишь
22 dva1c
 
05.10.11
06:19
Быстрее список, чем ТЗ.
(15) 1С++ ТС еще рановато, но изучить не мешает.
23 ЧеловекДуши
 
05.10.11
06:20
(22)Не буду убеждать, но на личном опыте показало, что СписокЗначений медленней ТЗ :)
24 dva1c
 
05.10.11
06:22
(23) а замеры что показывали?
25 VladZ
 
05.10.11
06:39
(0) Зачем тебе это?
26 VladZ
 
05.10.11
06:40
+25 Как показывает практика, в ресурсоемких задачах потеря времени идет на совсем других вещах...
27 dva1c
 
05.10.11
06:41
(26)+1
28 Кириллка
 
05.10.11
06:59
палец с хе®ом сравниваете.
29 KRV
 
05.10.11
07:27
Самое смешное, когда ищут производительность в списке с тремя элементами, зато потом перебором шерстят все документы со времен Царя Гороха..
30 dva1c
 
05.10.11
07:42
(29) перебором? а почему не запросом? )
31 dva1c
 
05.10.11
07:46
+(30) по идее, пост адресован (0)
32 VladZ
 
05.10.11
08:26
(29) Во-во... Вопрос в сабже без видения общего кода - не более чем чисто академический.
33 фобка
 
05.10.11
09:22
Процедура Сформировать()
   Lst = CreateObject("ValueList");
   For i = 1 To 100000 Do
       Lst.AddValue(i);
   EndDo;
   VT = CreateObject("ValueTable");
   VT.InsertColumn("Cnt");
   For i = 1 To 100000 Do
       VT.NewLine();
       VT.Cnt = i;
   EndDo;
   
   t1 = _GetPerformanceCounter();
   For i = 1 To Lst.GetListSize() Do
       A = Lst.GetValue(i);
   EndDo;
   Message("Цикл по списку: "+(_GetPerformanceCounter() - t1));
   
   t1 = _GetPerformanceCounter();
   VT.SelectLines();
   While VT.GetLine() = 1 Do
       A = VT.Cnt;
   EndDo;
   Message("Цикл по ТЗ: "+(_GetPerformanceCounter() - t1));
   
   t1 = _GetPerformanceCounter();
   For i = 1000 To 20000 Do
       Lst.FindValue(i);
       i = i+3;
   EndDo;
   Message("Поиск по списку: "+(_GetPerformanceCounter() - t1));
   
   t1 = _GetPerformanceCounter();
   For i = 1000 To 20000 Do
       VT.FindValue(i,0,"Cnt");
       i = i+3;
   EndDo;
   Message("Поиск по ТЗ: "+(_GetPerformanceCounter() - t1));
   
КонецПроцедуры


Результат:

Цикл по списку: 502
Цикл по ТЗ: 717
Поиск по списку: 9690
Поиск по ТЗ: 8234
34 aka MIK
 
05.10.11
09:24
те же яйца )
35 Chai Nic
 
05.10.11
11:01
(29) Теплый ламповый перебор не сравнится ни с какими богомерзкими черными запросами. К прямым запросам 1с++ сие не относится..
36 Lexxxxx
 
05.10.11
14:07
(33) Ну так а почему не

Procedure
...
EndProcedure

? :)
37 VladZ
 
05.10.11
14:19
(36) Видимо эта часть кода сгенерирована автоматически. :)
38 Lexxxxx
 
05.10.11
14:21
(37) И не лень ему было языки переключать?! Взял бы, как тру программер, и перековеркал шаблоны на английский! :)
39 Кириллка
 
06.10.11
08:11
(33)справедливости ради: (0) проход по ТЗ предлагал малость другой.
40 фобка
 
06.10.11
08:48
(38)ленивый программист - плохой программист. заметил что среди одинесниковтаких подавляющее большинство. :)
(39) конечно, в (0) еще медленнее
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.