| 
    
            
         
         | 
    
  | 
Что быстрее будет работать? | ☑ | ||
|---|---|---|---|---|
| 
    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) + в базе я один, база на локальном компе, так что можно сказать ,что загрузка системы равномерная.     
         | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |