Вход | Регистрация


1С:Предприятие ::

Метки:

Поиск в Таблице значений - есть ли индекс?

Я
   Killgur
 
03.03.04 - 08:51
Поделитесь соображениями на счет того, как работает НайтиЗначение() в ТЗ. Индексированный ли это поиск или простой перебор значений от начала до конца?
 
  Рекламное место пустует
   DimG
 
1 - 03.03.04 - 08:54
по индексу вроде...
   Killgur
 
2 - 03.03.04 - 09:38
(1) На чем основываешься?
   Killgur
 
3 - 03.03.04 - 09:38
(1) На чем основываешься?
   SnarkHunter
 
4 - 03.03.04 - 09:39
На исходниках 1С...
   Killgur
 
5 - 03.03.04 - 09:43
(1) На чем основываешься?
   SnarkHunter
 
6 - 03.03.04 - 09:44
Клавиша запала?
   It is me
 
7 - 03.03.04 - 09:47
(2)-(3) Простым сравнением замеров производительности видно, что НайтиЗначение работает на порядок быстрее...
   Killgur
 
8 - 03.03.04 - 09:58
Простите ;-)
При попытке отправить сообщение моя Опера почему то зависает на долгое время. Это мои проблемы или форума?

(4) Если на исходниках, то хорошо. А (7) замер производительности думаю тут нельзя использовать. Разница во времени можеть вполне быть интерпретацией кода 1С.
   DimG
 
9 - 03.03.04 - 11:09
основываюсь на теории баз данных, замерах производительности и на том как это реализовано в других языках, дельфях например. На территории обсасывался как то этот вопрос, вообщем пришли к выводу что по индексу...
   spock
 
10 - 03.03.04 - 11:35
2(9)На теории чего основываешься? Теории маразма или сарказма?
 
 
   Killgur
 
11 - 03.03.04 - 11:39
Так в ТЗ, что индекс по каждому полю есть?
ведь заранее не известно по какому полю будет идти поиск
   DimG
 
12 - 03.03.04 - 11:40
теории построения, прошу не придираться, маразм не оргазм...
   Рупор абсурда
 
13 - 03.03.04 - 11:44
Какие индексы? Вы чего? Тупейший перебор! ...
   spock
 
14 - 03.03.04 - 11:52
2(12)Сказал верно (11)....А по поводу теории, лучше почитай теорию структур данных, для конкретного случая.
   327
15 - 03.03.04 - 11:59
Ошибка.... В 1С все сделано через .... одно место....

P.S. согласно рекламе новый телефон LG с достойным виброзвонком можно носить где хочешь.... Некоторые носят рядом от этого места .... и просят им позвонить ...
   spock
 
16 - 03.03.04 - 12:17
pit, а кто сказал, что ТЗ должна иметь индексы?
   Рупор абсурда
 
17 - 03.03.04 - 12:20
Объясните мне новичку, зачем для поиска нужен индекс?
   Кое-кто@где-то.там
18 - 03.03.04 - 12:56
Ну как-же, поиск по индексу ведь гораздо быстрее, чем поиск без индекса и соответственно наоборот :)
Я не помню, знаешь ты dBase или нет, но это было так:
Locate - поиск без индекса
и
Seek - с индексом
   Рупор абсурда
 
19 - 03.03.04 - 13:01
(18) У ТЗ с диБэйсом так много общего ...
И поиск, и индексы какие-то ...
Дурдом! ...
   Кое-кто@где-то.там
20 - 03.03.04 - 14:12
(19) Дык, я же для примера ...
   327
21 - 03.03.04 - 14:13
(16) а кто сказал, что ТЗ не должна иметь индексов?...


Есть жизнь на Марсе.... Нет ли жизни на Марсе .... А какая в .... одноЭсное место .... разница ....
   spock
 
22 - 03.03.04 - 16:39
pit, потому как ТЗ это структура типа СПИСОК.
И совсем не обязана иметь индексы.
   Дмитрий
 
23 - 03.03.04 - 17:27
(22) Железный аргумент.

А кто знает точно?
   Кое-кто@где-то.там
24 - 03.03.04 - 17:27
Не используется. Точно.
   Рупор абсурда
 
25 - 03.03.04 - 17:36
(24) На чем основываешься?
   Рупор абсурда
 
26 - 03.03.04 - 17:36
(24) На чем основываешься?
   IAm
 
27 - 03.03.04 - 17:39
Сохранил ТЗ в текстовый файл, второй час ищу где там индекс спрятан.
   Кое-кто@где-то.там
28 - 03.03.04 - 17:40
Элементарно! Делаем большую ТЗ и ищем значение. На индексированных данных поиск выполнялся бы мгновенно.
   Рупор абсурда
 
29 - 03.03.04 - 17:41
(27) Новичок? Надо было в ДБФ сохранить ...
   Рупор абсурда
 
30 - 03.03.04 - 17:41
(24) На чем основываешься?
   Рупор абсурда
 
31 - 03.03.04 - 17:41
(24) На чем основываешься?
   IAm
 
32 - 03.03.04 - 17:42
29 Рупор, спасибо!!!! Получилось.
   IAm
 
33 - 03.03.04 - 17:42
30, 31 Добить решил?
 
  Рекламное место пустует
   Кое-кто@где-то.там
34 - 03.03.04 - 17:46
Процедура Сформировать()
    ТЗ=СоздатьОбъект("ТаблицаЗначений"); 
    ТЗ.НоваяКолонка("К","Число",1,0);
    ТЗ.КоличествоСТрок(1000000);     
    ТЗ.УстановитьЗначение(999999,"К",1);
    нсТЗ=0;
    НачалоЗамера=_GetPerformanceCounter();
    ТЗ.НайтиЗначение(1,нсТЗ,"К");
    Сообщить("Позиция: "+нсТЗ+", поиск продолжался: "+((_GetPerformanceCounter()-НачалоЗамера)/100)+" сек.");
КонецПроцедуры
...
Позиция: 999999, поиск продолжался: 4 сек.
   Рупор абсурда
 
35 - 03.03.04 - 17:48
(34) Это круто?
(32) Способный новичок!
(24) На чем основываешься?
   DimG
 
36 - 03.03.04 - 17:49
(34) теперь то же самое только перебором
   Рупор абсурда
 
37 - 03.03.04 - 17:51
(36) Т.е. ты считаешь, что если поиск перебором занимает времени больше, то ТЗ индексирована?
   Кое-кто@где-то.там
38 - 03.03.04 - 17:51
А вот такой разницы я признаться не ожидал, смотрим:

Перем ТЗ;

Функция ПоискВТЗ(Знач ИскомоеЗначение)
    Начало=1; Конец=ТЗ.КоличествоСтрок();
    Флаг=0;
    Пока (Флаг=0) И (Начало<=Конец) Цикл
        Середина=Цел((Начало+Конец)/2);
        НайденноеЗначение=ТЗ.ПолучитьЗначение(Середина,"К");
        Если НайденноеЗначение>ИскомоеЗначение тогда
            Конец=Мин(Середина,Конец-1);
        ИначеЕсли НайденноеЗначение<ИскомоеЗначение тогда
            Начало=Макс(Середина,Начало+1);
        Иначе
            Флаг=Середина;
        КонецЕсли; 
    КонецЦикла;         
    Пока Флаг>1 Цикл
        Если ТЗ.ПолучитьЗначение(Флаг-1,"К")<>ИскомоеЗначение тогда
            Прервать;
        КонецЕсли;    
        Флаг=Флаг-1;
    КонецЦикла;
    Возврат Флаг;// Возвращает: 0 - не найден, НомерСтроки в ТЗ если найден.

КонецФункции//Поиск(Значение)


//*******************************************

Процедура Сформировать()
    ТЗ=СоздатьОбъект("ТаблицаЗначений"); 
    ТЗ.НоваяКолонка("К","Число",1,0);
    ТЗ.КоличествоСТрок(1000000);     
    ТЗ.УстановитьЗначение(999999,"К",1);
    нсТЗ=0;
    НачалоЗамера=_GetPerformanceCounter();
    ТЗ.НайтиЗначение(1,нсТЗ,"К");
    Сообщить("Позиция: "+нсТЗ+", поиск продолжался: "+((_GetPerformanceCounter()-НачалоЗамера)/100)+" сек.");

    НачалоЗамера=_GetPerformanceCounter();
    нсТЗ=ПоискВТЗ(1);
    Сообщить("Позиция: "+нсТЗ+", поиск продолжался: "+((_GetPerformanceCounter()-НачалоЗамера)/100)+" сек.");
КонецПроцедуры
...
На выходе:
Позиция: 999999, поиск продолжался: 3.96 сек.
Позиция: 999999, поиск продолжался: 0.02 сек.
   DimG
 
39 - 03.03.04 - 17:53
(37) не факт конечно...
   Рупор абсурда
 
40 - 03.03.04 - 17:58
(38) А если единицы там 2 штуки, ещё надо узнать первую ли ты нашёл ...
   Рупор абсурда
 
41 - 03.03.04 - 17:58
(39) На чем основываешься?
   Кое-кто@где-то.там
42 - 03.03.04 - 18:02
(40) Не, не в этом дело. Второй поиск и есть эмуляция поиска по индексу.
   Рупор абсурда
 
43 - 03.03.04 - 18:04
(42) Да ..., я понял ...
   Кое-кто@где-то.там
44 - 03.03.04 - 18:06
(43) Ты уверен? На чем основываешься? ;)
   Рупор абсурда
 
45 - 03.03.04 - 18:07
(44) На методе ТЗ Сортировать() и функции объекта "Мозги" ЗдравыйСмысл() ...
   IAm
 
46 - 03.03.04 - 18:15
45 У многих эта функция работает некорректно.
   Кое-кто@где-то.там
47 - 03.03.04 - 18:19
(46) Вполне возможно, что просто не всегда хватает входных параметров.
   Кое-кто@где-то.там
48 - 03.03.04 - 18:20
Даже и в народе ведь говорят
"Не хватает"
   IAm
 
49 - 03.03.04 - 18:24
Просто входные параметры передаются по значению.
 
  Рекламное место пустует
   327
50 - 03.03.04 - 18:54
(36) не покатит сравнение... на уровне платформы быстрее ... результаты сравнения неадекватны ....



Список тем форума
Рекламное место пустует   Рекламное место пустует
Прочитай, хотя бы, Митичкина "Разработка в системе 1С:Предприятие 8". Волшебник
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Ветка сдана в архив. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует