Автор Тема: Говнокод  (Прочитано 16075 раз)

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Говнокод
« Ответ #15 : Июнь 08, 2012, 10:26:08 am »
Для 3 000 000 строк индекс строится 11 сек.

Ну не угадал я немного с 3-мя секундами  ;D

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: Говнокод
« Ответ #16 : Июнь 08, 2012, 11:53:15 am »
Все коллекции в 1с обходятся форычем. Я кстати замерил время построения составного индекса по трем полям в коллекции из 500000 элементов - 0,7 сек
Это понятно, что обходятся. Но я имел ввиду несколько иное. Форыч сейчас пихают куда попало, это как чума какая-то. Вот и парни из 1С тоже поддались поветрию. А если обход форычем начинается не с текущего элемента, на которым можно прыгнуть перед входом в цикл, найдя первый элемент, соответствующий необходимому условию, а с самого первого, то особого смысла упорядочивать коллекцию нет. Для работы с индексированной коллекцией нужно использовать другие подходы, для чего нужно включать мозг.
Что касается скорости построения индекса, то нужно проверять не на целочисленных полях, а на более сложных данных, лучше именно на том наборе данных, который присутствует в конфигурации.

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Говнокод
« Ответ #17 : Июнь 08, 2012, 12:20:32 pm »
Во первых я не слыхал чтобы форыч где-либо стартовал не с первого элемента. Во вторых в общем то и нету разницы с какого элемента он стартует, т.к. форыч обходит КАЖДЫЙ ЭЛЕМЕНТ, т.е. все элементы в данной коллекции.

Цитировать
Для работы с индексированной коллекцией нужно использовать другие подходы, для чего нужно включать мозг.
В смысле?

Цитировать
Что касается скорости построения индекса, то нужно проверять не на целочисленных полях, а на более сложных данных, лучше именно на том наборе данных, который присутствует в конфигурации.
А чем сложнее объект индексировать? И тем более с чего вы взяли, что число в 1С не объект?

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Говнокод
« Ответ #18 : Июнь 08, 2012, 01:10:25 pm »
Вот например нормальное число в 1С:
БольшоеЧисло = 131351354354354853131564346165156434345343543543543543541651531531513513513513513515151315315152132123111313513543543548531315643461651564343453435435435435435416515315315135135135135135151513153151521321231113135135435435485313156434616515643434534354354354354354165153153151351351351351351515131531515213212311131351354354354853131564346165156434345343543543543543541651531531513513513513513515151315315152132123111313513543543548531315643461651564343453435435435435435416515315315135135135135135151513153151521321231113135135435435485313156434616515643434534354354354354354165153153151351351351351351515131531515213212311131351354354354853131564346165156434345343543543543543541651531531513513513513513515151315315152132123111313513543543548531315643461651564343453435435435435435416515315315135135135135135151513153151521321231113135135435435485313156434616515643434534354354354354354165153153151351351351351351515131531515213212311131351354354354853131564346165156434345343543543543543541651531531513513513513513515151315315152132123111313513543543548531315643461651564343453435435435435435416515315315135135135135135151513153151521321231113135135435435485313156434616515643434534354354354354354165153153151351351351351351515131531515213212311131351354354354853131564346165156434345343543543543543541651531531513513513513513515151315315152132123111313513543543548531315643461651564343453435435435435435416515315315135135135135135151513153151521321231113135135435435485313156434616515643434534354354354354354165153153151351351351351351515131531515213212311131351354354354853131564346165156434345343543543543543541651531531513513513513513515151315315152132123111313513543543548531315643461651564343453435435435435435416515315315135135135135135151513153151521321231113135135435435485313156434616515643434534354354354354354165153153151351351351351351515131531515213212311131351354354354853131564346165156434345343543543543543541651531531513513513513513515151315315152132123111313513543543548531315643461651564343453435435435435435416515315315135135135135135151513153151521321231113135135435435485313156434616515643434534354354354354354165153153151351351351351351515131531515213212311;

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Говнокод
« Ответ #19 : Июнь 08, 2012, 01:36:43 pm »
Из встроенной справки:
Для каждого (For each)
Синтаксис:
    Для каждого <Имя переменной 1> Из <Имя переменной 2> Цикл
    // Операторы
    [Прервать;]
    // Операторы
    [Продолжить;]
    // Операторы
    КонецЦикла;

Англоязычный синтаксис:
    For each <Имя переменной 1> In <Имя переменной 2> Do
    // Операторы
    [Break;]
    // Операторы
    [Continue;]
    // Операторы
    EndDo;

Параметры:
    <Имя переменной 1>
    Переменная, которой при каждом повторении цикла присваивается значение очередного элемента коллекции.

    Из
    Синтаксическая связка для параметра <Имя переменной 2>.

    <Имя переменной 2>
    Переменная или выражение, предоставляющее коллекцию. Элементы этой
коллекции будут присваиваться параметру <Имя переменной 1>.

    Цикл
    Операторы, следующие за ключевым словом Цикл выполняются, пока значение переменной <Имя переменной> меньше значения <Выражение 2>.

    // Операторы
    Исполняемый оператор или последовательность таких операторов.

    Прервать
    Позволяет прервать выполнение цикла в любой точке. После выполнение этого оператора управление передается оператору, следующему за ключевым словом КонецЦикла.

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

    КонецЦикла
    Ключевое слово, которое завершает структуру оператора цикла.

Описание:
Оператор цикла Для каждого предназначен для циклического обхода коллекций значений. При каждой итерации цикла возвращается новый элемент коллекции. Обход осуществляется до тех пор, пока не будут перебраны все элементы коллекции.

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: Говнокод
« Ответ #20 : Июнь 08, 2012, 01:56:18 pm »
Во первых я не слыхал чтобы форыч где-либо стартовал не с первого элемента. Во вторых в общем то и нету разницы с какого элемента он стартует, т.к. форыч обходит КАЖДЫЙ ЭЛЕМЕНТ, т.е. все элементы в данной коллекции.
Итераторы и Форычи бывают разные, в том числе и те, которые позволяют обходить коллекцию и с конца и с произвольного (текущего) элемента. Ну и из Форыча можно выскочить на любой итерации (при  наличии механизмов выхода из цикла).

Цитировать
Для работы с индексированной коллекцией нужно использовать другие подходы, для чего нужно включать мозг.
В смысле?
Ну форыч проще, поэтому его часто и используют, я же говорю - поветрие.
А с индексированной коллекцией форыч стартующий всегда с первого элемента не эффективен в плане производительности - всё равно всю коллекцию обойдём, так зачем её индексировать? Я именно об этом и говорил - такой говнокод (приведённый Вами в первом сообщении) получился по причине использования форыча.
А чем сложнее объект индексировать? И тем более с чего вы взяли, что число в 1С не объект?
Ни с чего не взял, как раз наоборот, где-то в другой ветке я говорил что в 1С всё объект.
Но объект объекту рознь. Это ж по-сути похоже на вариант, и число там всё-таки хранится как число, а не как строка, к примеру, а индексировать по числу всяко быстрее индексирования строковых данных.
Но может, как я уже предполагал, в 1С всё-таки, допилили индексирование и оно стало рективным, что очень приятно, но когда, несколько лет назад, я обращался в саппорт 1С на предмет тормозов при построении индекса, и даже отправлял им тестовую конфу с данными на экспертизу, мне ответили, что это нормально, особой производительности на данном наборе данных и такого объема ждать не стоит. И предложили использовать временные таблицы, запросы и еще что-то, уже не помню. Поэтому от индексированной коллекции тогда пришлось отказаться ((

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: Говнокод
« Ответ #21 : Июнь 08, 2012, 02:02:34 pm »
Скачал сейчас последний релиз 8.2 погоняю, может стоит вернуться на 1С, а то тогда пришлось перейти на Delphi и писать всё ручками.

Berserker

  • Sr. Member
  • ****
  • Сообщений: 254
    • Просмотр профиля
Re: Говнокод
« Ответ #22 : Июнь 08, 2012, 02:32:09 pm »
Раз уж речь снова зашла об 1С, подскажи пожалуйста нормальную документацию к языку. Встроенный справочник на первый взгляд очень неудобен.

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: Говнокод
« Ответ #23 : Июнь 08, 2012, 02:46:12 pm »
Berserker, а чем комплект книг из поставки не устраивает? Там всё очень подробно на 4 или 5 томов.
Есть еще пара-тройка хороших книг других авторов, но названия не скажу, они у меня дома, а дома я окажусь только после 21-го. В электронном виде не видел, видимо 1С прибивает такие сайты.

Berserker

  • Sr. Member
  • ****
  • Сообщений: 254
    • Просмотр профиля
Re: Говнокод
« Ответ #24 : Июнь 08, 2012, 03:17:37 pm »
Мне более в учебных целях, так что 5 томов - это определённо не торт. Но всё равно спасибо.

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Говнокод
« Ответ #25 : Июнь 08, 2012, 04:58:15 pm »
Все книги Радченко. Для начинающих 'Практическое пособие разработчика'. Для продолжающих 'Профессиональная разработка'. Это самые лучшие источники. Других авторов читать не советую. Если автор не из 1с то в книгу лучше вообще не заглядывать, т.к. придется потом переучиваться

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Говнокод
« Ответ #26 : Июнь 08, 2012, 06:16:50 pm »
А с индексированной коллекцией форыч стартующий всегда с первого элемента не эффективен в плане производительности - всё равно всю коллекцию обойдём, так зачем её индексировать?

Зачем всю обходить?  ???
Вот жеш:
Процедура Обработать(Таблица, Отбор) // вызывается много много раз!
   
   ИскомыеСтроки = Таблица.НайтиСтроки(Отбор);
   
   Для Каждого ТекСтрока Из ИскомыеСтроки Цикл
      Рез = ТекСтрока.Четыре / 2; // какой-то код
   КонецЦикла;
   
КонецПроцедуры

ИскомыеСтроки - это массив строк из коллекции, отобранный быстрым поиском по индексу.
Обходим только его.

Вроде все элементарно. И очевидно, что это будет быстрее.

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: Говнокод
« Ответ #27 : Июнь 08, 2012, 06:49:29 pm »
ilovb, у меня такое ощущение, что мы говорим на разных языках  ;) ;) и о разных вещах  ???
Я говорю, что говнокод получился по причине чумового использования форычей, Вы мне отвечаете - индексы строятся быстро
Я говорю - нет смысла индексировать коллекцию для обхода её форычем, Вы мне отвечаете - так из нее можно отобрать нужные записи.
Как-то так  :D :D
Понятно, что можно, но я-то о другом  :P

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Говнокод
« Ответ #28 : Июнь 08, 2012, 06:54:27 pm »
Да, наверно о разном. Потому как я уже потерял нить рассуждений  :)

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: Говнокод
« Ответ #29 : Июнь 08, 2012, 07:05:50 pm »
Таки-да, сортировка стала быстрее и память вроде не жрёт. Набор из 3'786'524 записей был отсортирован за ~ 0:54 - 1:22 мин, разброс, видимо, связан с распределением памяти.