Имя: Пароль:
1C
1С v8
Что быстрее будет работать?
0 mzelensky
 
18.12.13
08:03
Собственно что быстрее и качественней отработает:

Если Метаданные.Документы.Найти(  Объект.Метаданные().имя  ) <> Неопределено тогда

или

Если  Метаданные.Документы.Содержит( Объект.Метаданные() ) <> Неопределено тогда
1 Klesk666
 
18.12.13
08:04
сделай в цикле - и замер производительности
2 Wobland
 
18.12.13
08:04
(1) а мы тут для чего?
3 1Сергей
 
18.12.13
08:04
(2) Чтобы сделать ставки
4 Wobland
 
18.12.13
08:06
Один англичанин все время проигрывал деньги на скачках. И однажды .он наконец понял, что нужно сделать, чтобы взять крупный выигрыш. Он не играл шесть лет. За шесть лет скопил шесть тысяч фунтов стерлингов. И через шесть лет шестого числа шестого месяца в день больших скачек в Лондоне он встал в шесть часов утра, специально вызвал такси с номером 66-66, приехал на ипподром, дал шесть шиллингов на чай таксисту, пошел в шестую кассу, и все шесть тысяч фунтов стерлингов поставил на шестой заезд на шестую лошадь. И лошадь пришла шестой.
5 1Сергей
 
18.12.13
08:12
Однажды, старый еврей 30 лет молился б-гу и просил ниспослать ему выигрышь в лотерею. И, наконец, б-г не выдержал и говорит еврею "Ну, купи уже лотерейный билет, блеать!"
6 kosts
 
18.12.13
08:18
(0) А не всё ли равно? У тебя в цикле миллион раз будет выполнятся?
7 mzelensky
 
18.12.13
08:22
(6) Достаточно часто вызывается.
Даи просто интересно
8 mzelensky
 
18.12.13
08:25
И кстати .а есть более универсальный метод определения типа объекта?

Допустим моя переменная "Объект" может быть абсолютно любого типа (строка, число, ссылка на справочник, ссылка на док и так далее).

Как провельней получить полный тип данных объекта??

Т.е. если "Объект" - это ссылка на док "Док1", то должно получиться "Документ.Док1"
9 1Сергей
 
18.12.13
08:25
(8) Тип(Объект)
10 skunk
 
18.12.13
08:26
жесть
11 vde69
 
модератор
18.12.13
08:27
(7)
1. не = будет быстрее чем <>
2. содержит возвращает булево, по этому конструкция
Если  Метаданные.Документы.Содержит(Объект.Метаданные())тогда

будет немного быстрее чем

Если не Метаданные.Документы.Найти(  Объект.Метаданные().имя  ) = Неопределено тогда
12 mzelensky
 
18.12.13
08:28
(9) Ты наверное хотел сказать "ТипЗНЧ(Объект)" -
Это в 8.1 прокатывает .а в 8.2 нифига он вернет просто "Док1"
13 mzelensky
 
18.12.13
08:28
(10) Что жесть?
14 Wobland
 
18.12.13
08:28
(11) уверен про = и <>?
15 Wobland
 
18.12.13
08:28
+(14) панеслась..
16 mzelensky
 
18.12.13
08:29
(11) А почему "не = будет быстрее чем <>" ? Просто личные наблюдения или где-то документировано?
17 mzelensky
 
18.12.13
08:30
(15) Провокатор...
18 Ranger_83
 
18.12.13
08:30
А разница в несколько миллисекунд?
19 Wobland
 
18.12.13
08:31
(17) да не. искреннее считаю, что разницы нет
20 Wobland
 
18.12.13
08:31
а то бывают такие мнения, что <> - это две операции, к примеру
21 Ranger_83
 
18.12.13
08:33
(20) Карл и Маркс это два разных человека
22 mzelensky
 
18.12.13
08:34
(18) НУ даже просто теоретически интересно.

Уже делаю обработочку для замера.
23 Wobland
 
18.12.13
08:34
(21) дада, как звали жену Бойля-Мариотта?
24 vde69
 
модератор
18.12.13
08:34
(19) небольшая разница есть, "не" и "=" унарный операции (самые быстрые), "<>" включает в себя обязательную проверку типа значения
25 Wobland
 
18.12.13
08:35
(24) ну, допустим, "=" - ни разу не унарная операция..
26 jsmith82
 
18.12.13
08:37
Если Метаданные.Документы.Найти(  Об.Метаданные().имя  ) <> Неопределено Тогда
0,000042
Если  Метаданные.Документы.Содержит( Об.Метаданные() ) <> Неопределено Тогда
0,000002
То есть второй вариант быстрее в 21 раз
27 Pahomich
 
18.12.13
08:37
А куда нам торопится? Быстрее работает - меньше оплата!
28 НЕА123
 
18.12.13
08:37
(22)
ежели теоретически, то 1 быстрее.
т.к. обращение к Метаданные.Документы происходит в 1 раз,
а во втором случае - 2 раза.
практически - хз.
29 vde69
 
модератор
18.12.13
08:38
ждем замеров...

хотя лично по мне - разница так мала, что ей можно принебреч...
30 НЕА123
 
18.12.13
08:38
(28)
* первый-второй перепутал.
31 vde69
 
модератор
18.12.13
08:40
(26) теперь поменяй местами строчки и повтори (что-бы исключить влияние кешей)
32 Ranger_83
 
18.12.13
08:40
(23) а полонез Огинского кто кто написал?
33 jsmith82
 
18.12.13
08:41
Если в 1000-кратном цикле
Если Метаданные.Документы.Найти(  Об.Метаданные().имя  ) <> Неопределено Тогда
0,013086
Если  Метаданные.Документы.Содержит( Об.Метаданные() ) <> Неопределено Тогда
0,009117
То есть второй вариант быстрее в 1,43 раза
34 jsmith82
 
18.12.13
08:43
(31) поменял строчки
Если в 1000-кратном цикле
Если Метаданные.Документы.Найти(  Об.Метаданные().имя  ) <> Неопределено Тогда
0,012465
Если  Метаданные.Документы.Содержит( Об.Метаданные() ) <> Неопределено Тогда
0,010558
То есть второй вариант быстрее в 1,18 раза
35 jsmith82
 
18.12.13
08:44
Если без цикла, то в 2 раза теперь
36 vde69
 
модератор
18.12.13
08:44
(34) а теперь

Если не Метаданные.Документы.Найти(  Об.Метаданные().имя  ) = Неопределено Тогда
37 Ranger_83
 
18.12.13
08:44
(34) выборка слишком мала.Может влиять загрузка самой системы
38 jsmith82
 
18.12.13
08:44
(35) Ха, я гоню, теперь медленнее в 2 раза!!!
39 jsmith82
 
18.12.13
08:45
(37 ) согласен
40 Drac0
 
18.12.13
08:45
Думаю, еще стоит учесть, что первый вариант не дает 100% гарантии правильного ответа. Например, может быть документ условно "ЗаказПокупателя" и отчет "ЗаказПокупателя". Результат будет некорректным.
41 Ranger_83
 
18.12.13
08:47
"ТС скучно набросил"(с)
42 vde69
 
модератор
18.12.13
08:47
(38) "честный" тест сделать не так просто :)
43 Ranger_83
 
18.12.13
08:49
Цикл побольше сделать и кэш прочистить предварительно
44 jsmith82
 
18.12.13
08:49
в общем сделал цикл на 100 тыс
строки переворачивал
в обоих случаях коээфициент ~1,35 в пользу содержкит
45 jsmith82
 
18.12.13
08:50
кэш почистил
всё то же 1,35 в пользу содержит
46 skunk
 
18.12.13
08:50
47 skunk
 
18.12.13
08:51
замена омтДокумент.Имя на стрИмя с получением имени вне цикла на производительности почти не сказывается
48 Ranger_83
 
18.12.13
08:52
(44) какая СУБД?
49 jsmith82
 
18.12.13
08:52
(44) файловая у мну
50 mzelensky
 
18.12.13
09:06
В общем сделал замеры в цикле. Проверял 3 варианта:

1) Если Метаданные.Документы.Найти(  Объект.Метаданные().имя  ) <> Неопределено тогда

2) Если НЕ Метаданные.Документы.Найти(  Объект.Метаданные().имя  ) = Неопределено тогда

3) Если  Метаданные.Документы.Содержит( Объект.Метаданные() ) <> Неопределено тогда

По результатам замера получается ,что первый вариант быстрее, а именно вот так:

Если Метаданные.Документы.Найти(  Объект.Метаданные().имя  ) <> Неопределено тогда
51 mzelensky
 
18.12.13
09:09
база файловая на "1С:Предприятие 8.2 (8.2.18.109)"
Вот как тестил:

Процедура КнопкаВыполнитьНажатие(Кнопка)
    // Вставить содержимое обработчика.    
    Для Сч=1 по 10000 цикл
        Если Объект<>неопределено тогда
            Если ТипЗнч(Объект)=Тип("Дата")  тогда
                флТип="Дата";                
            ИначеЕсли ТипЗнч(Объект)=Тип("Число")  тогда
                флТип="Число";
            ИначеЕсли ТипЗнч(Объект)=Тип("строка")  тогда
                флТип="строка";
            ИначеЕсли ТипЗнч(Объект)=Тип("Булево")  тогда
                флТип="Булево";
            ИначеЕсли Метаданные.Документы.Найти(  Объект.Метаданные().имя  ) <> Неопределено тогда     
                флТип="Документ."+ Строка(Объект.Метаданные().имя);    
            ИначеЕсли Метаданные.Справочники.Найти( Объект.Метаданные().имя  ) <> Неопределено тогда
                флТип="Справочник."+ Строка(Объект.Метаданные().имя);    
            ИначеЕсли Метаданные.ПланыВидовХарактеристик.Найти( Объект.Метаданные().имя  ) <> Неопределено тогда
                флТип="ПланВидовХарактеристик."+ Строка(Объект.Метаданные().имя);            
            ИначеЕсли Метаданные.ПланыВидовРасчета.Найти( Объект.Метаданные().имя  ) <> Неопределено тогда
                флТип="ПланВидовРасчета."+Строка(Объект.Метаданные().имя) ;
            ИначеЕсли Метаданные.ПланыСчетов.Найти( Объект.Метаданные().имя  ) <> Неопределено тогда
                флТип="ПланСчетов."+ Строка(Объект.Метаданные().имя);
            ИначеЕсли Метаданные.БизнесПроцессы.Найти( Объект.Метаданные().имя  ) <> Неопределено тогда
                флТип="БизнесПроцесс."+ Строка(Объект.Метаданные().имя);
            ИначеЕсли Метаданные.Задачи.Найти( Объект.Метаданные().имя  ) <> Неопределено тогда
                флТип="Задача."+ Строка(Объект.Метаданные().имя);
            КонецЕсли;          
        КонецЕслИ;
    КонецЦикла;
КонецПроцедуры

Процедура ОсновныеДействияФормыДействие(Кнопка)
    // Вставить содержимое обработчика.
    Для Сч=1 по 10000 цикл
        Если Объект<>неопределено тогда
            Если ТипЗнч(Объект)=Тип("Дата")  тогда
                флТип="Дата";                
            ИначеЕсли ТипЗнч(Объект)=Тип("Число")  тогда
                флТип="Число";
            ИначеЕсли ТипЗнч(Объект)=Тип("строка")  тогда
                флТип="строка";
            ИначеЕсли ТипЗнч(Объект)=Тип("Булево")  тогда
                флТип="Булево";
            ИначеЕсли НЕ Метаданные.Документы.Найти(  Объект.Метаданные().имя  ) = Неопределено тогда
                флТип="Документ."+ Строка(Объект.Метаданные().имя);    
            ИначеЕсли НЕ Метаданные.Справочники.Найти( Объект.Метаданные().имя  ) = Неопределено тогда
                флТип="Справочник."+ Строка(Объект.Метаданные().имя);    
            ИначеЕсли НЕ Метаданные.ПланыВидовХарактеристик.Найти( Объект.Метаданные().имя  ) = Неопределено тогда
                флТип="ПланВидовХарактеристик."+ Строка(Объект.Метаданные().имя);            
            ИначеЕсли НЕ Метаданные.ПланыВидовРасчета.Найти( Объект.Метаданные().имя  ) = Неопределено тогда
                флТип="ПланВидовРасчета."+Строка(Объект.Метаданные().имя) ;
            ИначеЕсли НЕ Метаданные.ПланыСчетов.Найти( Объект.Метаданные().имя  ) = Неопределено тогда
                флТип="ПланСчетов."+ Строка(Объект.Метаданные().имя);
            ИначеЕсли НЕ Метаданные.БизнесПроцессы.Найти( Объект.Метаданные().имя  ) = Неопределено тогда
                флТип="БизнесПроцесс."+ Строка(Объект.Метаданные().имя);
            ИначеЕсли НЕ Метаданные.Задачи.Найти( Объект.Метаданные().имя  ) = Неопределено тогда
                флТип="Задача."+ Строка(Объект.Метаданные().имя);
            КонецЕсли;          
        КонецЕслИ;
    КонецЦикла;
КонецПроцедуры

Процедура ОсновныеДействияФормыДействие1(Кнопка)
    // Вставить содержимое обработчика.
    Для Сч=1 по 10000 цикл
        Если Объект<>неопределено тогда
            Если ТипЗнч(Объект)=Тип("Дата")  тогда
                флТип="Дата";                
            ИначеЕсли ТипЗнч(Объект)=Тип("Число")  тогда
                флТип="Число";
            ИначеЕсли ТипЗнч(Объект)=Тип("строка")  тогда
                флТип="строка";
            ИначеЕсли ТипЗнч(Объект)=Тип("Булево")  тогда
                флТип="Булево";
            ИначеЕсли Метаданные.Документы.Содержит( Объект.Метаданные()  )  тогда
                флТип="Документ."+ Строка(Объект.Метаданные().имя);    
            ИначеЕсли Метаданные.Справочники.Содержит( Объект.Метаданные()) тогда
                флТип="Справочник."+ Строка(Объект.Метаданные().имя);    
            ИначеЕсли Метаданные.ПланыВидовХарактеристик.Содержит( Объект.Метаданные()) тогда
                флТип="ПланВидовХарактеристик."+ Строка(Объект.Метаданные().имя);            
            ИначеЕсли Метаданные.ПланыВидовРасчета.Содержит( Объект.Метаданные()) тогда
                флТип="ПланВидовРасчета."+Строка(Объект.Метаданные().имя) ;
            ИначеЕсли Метаданные.ПланыСчетов.Содержит( Объект.Метаданные()) тогда
                флТип="ПланСчетов."+ Строка(Объект.Метаданные().имя);
            ИначеЕсли Метаданные.БизнесПроцессы.Содержит( Объект.Метаданные()) тогда
                флТип="БизнесПроцесс."+ Строка(Объект.Метаданные().имя);
            ИначеЕсли Метаданные.Задачи.Содержит( Объект.Метаданные()) тогда
                флТип="Задача."+ Строка(Объект.Метаданные().имя);
            КонецЕсли;          
        КонецЕслИ;
    КонецЦикла;
КонецПроцедуры



Вот порядок цифр для разных типов "Объета" (каждая колонка это отдельный тип Объекта, каждая строка это порядковый номер процелдуры (метода))


0,001428       0,001390      0,001517     0,011175
0,001429       0,001733      0,001122     0,011650
0,001595       0,001775      0,001544     0,011545
52 mzelensky
 
18.12.13
09:10
(51) + в базе я один, база на локальном компе, так что можно сказать ,что загрузка системы равномерная.