Имя: Пароль:
1C
1С v8
что работает быстрее соответствие, список значений или таблица значений
,
0 jenny_tea
 
22.01.13
13:34
Изначально есть такая таблица тДанных имеющая 2 колонки: Подразделение и Метка.

Если необходимо в последствии несколько раз обрабатывать таблицу так что для некоторого массива будет выбираться соответствие по текущему подразделению его метки, т.е. примерно так

Для Текстрока из ДругогоМассива Цикл
  если тДанных.Найти(текСтрока.Подразделение,"Подразделение") тогда
      Текстрока.Флаг = тДанных.Метка
  конецесли;
конеццикла;

Будет ли быстрее если заранее сделать спАктивныхПодразделений куда закидывать все значения подразделений с активной меткой, а в цикле делать
если спАктивныхПодразделений.НайтиЗначение(Текстрока.Подразделение)<>Неопределено Тогда
  Текстрока.Флаг = Истина;
Иначе
  Текстрока.Флаг = Ложь;
КонецЕсли;

Или сделать НекоеСоответствие с Ключом -Подразделение и Значением Флаг
И тогда
текФлаг = НекоеСоответствие.Получить(текстрока.подразделение);
Если текФлаг<>Неопределено Тогда
ТекСтрока.Флаг = текФлаг;
конецЕсли;


Вопрос: как по скорости работают эти методы, что быстрее, т.е. сравнивая
тДанных.Найти(Значение,"Колонка");
спЗначений.НайтиЗначение(Значение);
НекоеСоответствие.Получить(Значение)
1 Ник второй
 
22.01.13
13:35
(0) Текущая реализация чем не устраивает?
2 vmv
 
22.01.13
13:35
соответствие, ибо примитивнее остальных вариантов и индексировано
3 aka AMIGO
 
22.01.13
13:35
в 8-ке нет замеров производительности?
4 Buster007
 
22.01.13
13:39
(0) в тДанных добавь индекс на подразделение. А вообще тема бред.
5 Fragster
 
гуру
22.01.13
13:41
таблица медленнее всего, массив (ЕМНИП) быстрее всех... когда-то замеры делал, уже не помню. Соответствие - норм.
6 GANR
 
22.01.13
13:41
(0) замер производительности в помощь
7 Reset
 
22.01.13
13:46
(0)
При поиске соответствие минимально быстрее индексированной таблицы значений, остальные варианты отстают от них.
Но не надо забывать учитывать и время создания коллекции для поиска. Может оказаться что пара быстрых поисков не окупит долгую подготовку.
Для конкретного выбора -->(6)
8 jenny_tea
 
22.01.13
13:57
спасибо
9 H A D G E H O G s
 
22.01.13
14:00
Хлопнулись штоле все?
2 колонки: Подразделение, Метка

Подразделение...
Че там их 100500 штук штоле? Какие индексы?

ТЗ конечно.
10 H A D G E H O G s
 
22.01.13
14:01
+ померять производительность, играясь с типизацией колонки.
11 H A D G E H O G s
 
22.01.13
14:03
Ну или массив.
12 Ns33
 
22.01.13
14:09
Недавно мерял такую штуку: есть массив чисел, посчитать сумму.

На 10'000 элементах:
1. Перебор массива - 280 мс
2. Создание и заполнение ТЗ и выполнение Итог()- 560 мс
3. Только выполнение Итог() - 30 мс.

Так что для многократных действий лучше ТЗ.
13 Fragster
 
гуру
22.01.13
14:29
мЯваСкрипт = Новый COMОбъект("MSScriptControl.ScriptControl");
мЯваСкрипт.Language = "javascript";

Время = мЯваСкрипт.Eval("(new Date()).valueOf()");
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("Ключ");
ТЗ.Индексы.Добавить("Ключ");
ТЗ.Колонки.Добавить("Значение");
Для Сч = 1 По 1000 Цикл
   Стр = ТЗ.Добавить();
   Стр.Ключ = Сч;
   Стр.Значение = Сч;
КонецЦикла;
Время = мЯваСкрипт.Eval("(new Date()).valueOf()") - Время;
Сообщить("Заполнение ТЗ: " + Время);

Время = мЯваСкрипт.Eval("(new Date()).valueOf()");
Для Сч = 1 По 1000 Цикл
   Стр = ТЗ.Найти(Сч, "Ключ");
   Если Стр <> Неопределено Тогда
       А = Стр.Значение;
   КонецЕсли;
КонецЦикла;
Время = мЯваСкрипт.Eval("(new Date()).valueOf()") - Время;
Сообщить("Поиск в ТЗ: " + Время);

Время = мЯваСкрипт.Eval("(new Date()).valueOf()");
Соо = Новый Соответствие;
Для Сч = 1 По 1000 Цикл
   Соо.Вставить(Сч, Сч);
КонецЦикла;
Время = мЯваСкрипт.Eval("(new Date()).valueOf()") - Время;
Сообщить("Заполнение соответствия: " + Время);

Время = мЯваСкрипт.Eval("(new Date()).valueOf()");
Для Сч = 1 По 1000 Цикл
   Значение = Соо[Сч];
   Если Значение <> Неопределено Тогда
       А = Значение;
   КонецЕсли;
КонецЦикла;
Время = мЯваСкрипт.Eval("(new Date()).valueOf()") - Время;
Сообщить("Поиск в соответствии: " + Время);

Время = мЯваСкрипт.Eval("(new Date()).valueOf()");
МассивКлючей = Новый Массив;
МассивЗначений = Новый Массив;
Для Сч = 1 По 1000 Цикл
   МассивКлючей.Добавить(Сч);
   МассивЗначений.Добавить(Сч);
КонецЦикла;
Время = мЯваСкрипт.Eval("(new Date()).valueOf()") - Время;
Сообщить("Заполнение массива: " + Время);

Время = мЯваСкрипт.Eval("(new Date()).valueOf()");
Для Сч = 1 По 1000 Цикл
   Индекс = МассивКлючей.Найти(Сч);
   Если Индекс <> Неопределено Тогда
       А = МассивЗначений[Индекс];
   КонецЕсли;
КонецЦикла;
Время = мЯваСкрипт.Eval("(new Date()).valueOf()") - Время;
Сообщить("Поиск в массиве: " + Время);
14 Fragster
 
гуру
22.01.13
14:30
результат:
Заполнение ТЗ: 109
Поиск в ТЗ: 110
Заполнение соответствия: 93
Поиск в соответствии: 172
Заполнение массива: 16
Поиск в массиве: 31
15 H A D G E H O G s
 
22.01.13
14:31
(14)
1) Убрать ТЗ.Индексы.Добавить("Ключ");
2) Перенести ТЗ.Индексы.Добавить("Ключ"); после заполнения
16 H A D G E H O G s
 
22.01.13
14:31
Что будет?
17 Fragster
 
гуру
22.01.13
14:32
для 10000 повторений массив уже отсасывает:
Заполнение ТЗ: 1 172
Поиск в ТЗ: 1 032
Заполнение соответствия: 921
Поиск в соответствии: 1 735
Заполнение массива: 79
Поиск в массиве: 2 062
18 Fragster
 
гуру
22.01.13
14:34
(15)(16)
для 1000 итераций:
без индекса:
Заполнение ТЗ: 94
Поиск в ТЗ: 187
Заполнение соответствия: 78
Поиск в соответствии: 172
Заполнение массива: 16
Поиск в массиве: 31

Индекс после заполнения:
Заполнение ТЗ: 203
Поиск в ТЗ: 110
Заполнение соответствия: 93
Поиск в соответствии: 172
Заполнение массива: 16
Поиск в массиве: 31
19 Reset
 
22.01.13
14:38
(13) Выполнил у себя:
Заполнение ТЗ: 8
Поиск в ТЗ: 6
Заполнение соответствия: 2
Поиск в соответствии: 3
Заполнение массива: 3
Поиск в массиве: 14
20 1Сергей
 
22.01.13
14:42
(13) иде СЗ?
21 Reset
 
22.01.13
14:42
(19) При увеличении как размерности коллекций, так и при увеличении количесва повторов массив начинает отставать сильнее, а соотношение соответствия и индексированной тз остаются примерно одинаковыми, т.е. как я и тестировал когда-то ранее.
Непонятно, почему у тебя в(14) соответствие отстало.
22 Fragster
 
гуру
22.01.13
14:44
Добавил случайности:

мЯваСкрипт = Новый COMОбъект("MSScriptControl.ScriptControl");
мЯваСкрипт.Language = "javascript";


Время = мЯваСкрипт.Eval("(new Date()).valueOf()");
СлучайныйМассив = Новый Массив;
Для Сч = 1 по 1000 Цикл
   СлучайныйМассив.Добавить(XMLСтрока(Новый УникальныйИдентификатор));
КонецЦикла;
Время = мЯваСкрипт.Eval("(new Date()).valueOf()") - Время;
Сообщить("Заполнение ключей: " + Время);

Время = мЯваСкрипт.Eval("(new Date()).valueOf()");
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("Ключ");
ТЗ.Индексы.Добавить("Ключ");
ТЗ.Колонки.Добавить("Значение");
Для каждого Ключ Из СлучайныйМассив Цикл
   Стр = ТЗ.Добавить();
   Стр.Ключ = Ключ;
   Стр.Значение = Ключ;
КонецЦикла;
Время = мЯваСкрипт.Eval("(new Date()).valueOf()") - Время;
Сообщить("Заполнение ТЗ: " + Время);

Время = мЯваСкрипт.Eval("(new Date()).valueOf()");
Для каждого Ключ Из СлучайныйМассив Цикл
   Стр = ТЗ.Найти(Ключ, "Ключ");
   Если Стр <> Неопределено Тогда
       А = Стр.Значение;
   КонецЕсли;
КонецЦикла;
Время = мЯваСкрипт.Eval("(new Date()).valueOf()") - Время;
Сообщить("Поиск в ТЗ: " + Время);

Время = мЯваСкрипт.Eval("(new Date()).valueOf()");
Соо = Новый Соответствие;
Для каждого Ключ Из СлучайныйМассив Цикл
   Соо.Вставить(Ключ, Ключ);
КонецЦикла;
Время = мЯваСкрипт.Eval("(new Date()).valueOf()") - Время;
Сообщить("Заполнение соответствия: " + Время);

Время = мЯваСкрипт.Eval("(new Date()).valueOf()");
Для каждого Ключ Из СлучайныйМассив Цикл
   Значение = Соо[Ключ];
   Если Значение <> Неопределено Тогда
       А = Значение;
   КонецЕсли;
КонецЦикла;
Время = мЯваСкрипт.Eval("(new Date()).valueOf()") - Время;
Сообщить("Поиск в соответствии: " + Время);

Время = мЯваСкрипт.Eval("(new Date()).valueOf()");
МассивКлючей = Новый Массив;
МассивЗначений = Новый Массив;
Для каждого Ключ Из СлучайныйМассив Цикл
   МассивКлючей.Добавить(Ключ);
   МассивЗначений.Добавить(Ключ);
КонецЦикла;
Время = мЯваСкрипт.Eval("(new Date()).valueOf()") - Время;
Сообщить("Заполнение массива: " + Время);

Время = мЯваСкрипт.Eval("(new Date()).valueOf()");
Для каждого Ключ Из СлучайныйМассив Цикл
   Индекс = МассивКлючей.Найти(Ключ);
   Если Индекс <> Неопределено Тогда
       А = МассивЗначений[Индекс];
   КонецЕсли;
КонецЦикла;
Время = мЯваСкрипт.Eval("(new Date()).valueOf()") - Время;
Сообщить("Поиск в массиве: " + Время);
23 Fragster
 
гуру
22.01.13
14:45
интересно, что результаты при этом вообще не изменились...
24 Fragster
 
гуру
22.01.13
14:45
надо как-то произвольный поиск организовать...
25 Fragster
 
гуру
22.01.13
14:50
мЯваСкрипт = Новый COMОбъект("MSScriptControl.ScriptControl");
мЯваСкрипт.Language = "javascript";

Размер = 1000;
Поисков = 1000;

Время = мЯваСкрипт.Eval("(new Date()).valueOf()");
СлучайныйМассив = Новый Массив;
Для Сч = 1 по Размер Цикл
   СлучайныйМассив.Добавить(XMLСтрока(Новый УникальныйИдентификатор));
КонецЦикла;
Время = мЯваСкрипт.Eval("(new Date()).valueOf()") - Время;
Сообщить("Заполнение ключей: " + Время);

ГСЧ = Новый ГенераторСлучайныхЧисел;

Время = мЯваСкрипт.Eval("(new Date()).valueOf()");
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("Ключ");
ТЗ.Индексы.Добавить("Ключ");
ТЗ.Колонки.Добавить("Значение");
Для каждого Ключ Из СлучайныйМассив Цикл
   Стр = ТЗ.Добавить();
   Стр.Ключ = Ключ;
   Стр.Значение = Ключ;
КонецЦикла;
Время = мЯваСкрипт.Eval("(new Date()).valueOf()") - Время;
Сообщить("Заполнение ТЗ: " + Время);

Время = мЯваСкрипт.Eval("(new Date()).valueOf()");

Для Сч = 1 по Поисков Цикл
   Стр = ТЗ.Найти(СлучайныйМассив[ГСЧ.СлучайноеЧисло(0,Размер-1)], "Ключ");
   Если Стр <> Неопределено Тогда
       А = Стр.Значение;
   КонецЕсли;
КонецЦикла;
Время = мЯваСкрипт.Eval("(new Date()).valueOf()") - Время;
Сообщить("Поиск в ТЗ: " + Время);

Время = мЯваСкрипт.Eval("(new Date()).valueOf()");
Соо = Новый Соответствие;
Для каждого Ключ Из СлучайныйМассив Цикл
   Соо.Вставить(Ключ, Ключ);
КонецЦикла;
Время = мЯваСкрипт.Eval("(new Date()).valueOf()") - Время;
Сообщить("Заполнение соответствия: " + Время);

Время = мЯваСкрипт.Eval("(new Date()).valueOf()");
Для Сч = 1 по Поисков Цикл
   Значение = Соо[СлучайныйМассив[ГСЧ.СлучайноеЧисло(0,Размер-1)]];
   Если Значение <> Неопределено Тогда
       А = Значение;
   КонецЕсли;
КонецЦикла;
Время = мЯваСкрипт.Eval("(new Date()).valueOf()") - Время;
Сообщить("Поиск в соответствии: " + Время);

Время = мЯваСкрипт.Eval("(new Date()).valueOf()");
МассивКлючей = Новый Массив;
МассивЗначений = Новый Массив;
Для каждого Ключ Из СлучайныйМассив Цикл
   МассивКлючей.Добавить(Ключ);
   МассивЗначений.Добавить(Ключ);
КонецЦикла;
Время = мЯваСкрипт.Eval("(new Date()).valueOf()") - Время;
Сообщить("Заполнение массива: " + Время);

Время = мЯваСкрипт.Eval("(new Date()).valueOf()");
Для Сч = 1 по Поисков Цикл
   Индекс = МассивКлючей.Найти(СлучайныйМассив[ГСЧ.СлучайноеЧисло(0,Размер-1)]);
   Если Индекс <> Неопределено Тогда
       А = МассивЗначений[Индекс];
   КонецЕсли;
КонецЦикла;
Время = мЯваСкрипт.Eval("(new Date()).valueOf()") - Время;
Сообщить("Поиск в массиве: " + Время);
26 Fragster
 
гуру
22.01.13
14:52
Размер = 10000;
Поисков = 1000;

Заполнение ключей: 172
Заполнение ТЗ: 1 219
Поиск в ТЗ: 125
Заполнение соответствия: 938
Поиск в соответствии: 203
Заполнение массива: 94
Поиск в массиве: 1 250
27 Reset
 
22.01.13
14:53
Размер = 10000;
Поисков = 1000;

Заполнение ключей: 47
Заполнение ТЗ: 84
Поиск в ТЗ: 11
Заполнение соответствия: 26
Поиск в соответствии: 6
Заполнение массива: 24
Поиск в массиве: 413

:)
28 Fragster
 
гуру
22.01.13
14:54
(27) чота у тебя комп больно быстрый
29 Reset
 
22.01.13
14:56
хз
core i5 750
30 Reset
 
22.01.13
14:57
Мне удивительней диаметральные результаты ТЗ/Соответствие
31 Fragster
 
гуру
22.01.13
14:57
пентиум4 2,8 ггц
32 Fragster
 
гуру
22.01.13
14:58
(30) наверное у тебя хэш сильно быстро считается
33 Fragster
 
гуру
22.01.13
14:58
лдя преобразования ключа в хэшиндекс
34 Fragster
 
гуру
22.01.13
14:59
Размер = 10000;
Поисков = 1000;

Заполнение ключей: 156
Заполнение ТЗ: 1 218
Поиск в ТЗ: 141
Заполнение соответствия: 953
Поиск в соответствии: 187
Заполнение массива: 94
Поиск в массиве: 1 203
35 jenny_tea
 
22.01.13
16:38
На самом деле проблема следующая, на одной из закладой на форме есть Таблица Значений - Дерево с Данными СправочникСписок.ПодразделенияОрганизации , я дополняю этот список метками для выделения активных.

Когда открываешь эту закладку список прорисовывается в районе 5 секунд, в серверной базе (в файловой локальной меньше секунды) я и подумала что дело в том что при Получении данных ищу из ТЗ в которой храню Подразделения и метки. а Замер производительности дал мне что больше всего времени вообще другая хрень какая-то занимает из не моего модуля которую я не использовала, но видимо привязанная к Подразделениям, причем все последующие действия пометки или скоки вниз вверх по подразделениям делаются моментально
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа. Фредерик Брукс-младший