Вход | Регистрация
    1  2
1С:Предприятие :: 1С:Предприятие 8 общая

Коллеги, ваше мнение. Код такого вид имеет право на жизнь или это говнокод?

[Serg_1960, 18.02.21 - 12:49]
Коллеги, ваше мнение. Код такого вид имеет право на жизнь или это говнокод?
Я
   Галахад
 
18.02.21 - 10:46
[1C]

    Таблица = Новый ТаблицаЗначений;
    Таблица.Колонки.Добавить("а", Новый ОписаниеТипов("Булево"));
    Таблица.Колонки.Добавить("б", Новый ОписаниеТипов("Строка"));
    
    НовСтр = Таблица.Добавить();
    НовСтр.а = Истина;
    НовСтр.б = "ббб";
    НовСтр = Таблица.Добавить();
    НовСтр.а = Ложь;
    НовСтр.б = "бббббб";
    
    
    Таблица2 = Новый ТаблицаЗначений;
    Таблица2.Колонки.Добавить("а", Новый ОписаниеТипов("Булево"));
    Таблица2.Колонки.Добавить("г", Новый ОписаниеТипов("Строка"));
    
    НовСтр = Таблица2.Добавить();
    НовСтр.а = Истина;
    НовСтр.г = "ууу";
    
    
    Запрос = Новый Запрос;
    Запрос.УстановитьПараметр("Таблица", Таблица);
    Запрос.УстановитьПараметр("Таблица2", Таблица2);
    
    Запрос.Текст =
    "ВЫБРАТЬ
    |    *
    |ПОМЕСТИТЬ ТаблицаДанных
    |ИЗ
    |    &Таблица КАК Таблица
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |    *
    |ПОМЕСТИТЬ ТаблицаДанных2
    |ИЗ
    |    &Таблица2 КАК Таблица2
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |    *
    |ИЗ
    |    ТаблицаДанных КАК ТаблицаДанных
    |        ЛЕВОЕ СОЕДИНЕНИЕ ТаблицаДанных2 КАК ТаблицаДанных2
    |        ПО ТаблицаДанных.а = ТаблицаДанных2.а";
    
    Таб = Запрос.Выполнить().Выгрузить();
    Таб.Колонки.Удалить("а1");


[/1C]
   Garykom
 
101 - 18.02.21 - 16:40
(100) и скажи скоко
   Serg_1960
 
102 - 18.02.21 - 16:47
Эээ... народ, мне тут кто-то обещали мой код проверить :(
   H A D G E H O G s
 
103 - 18.02.21 - 16:50
Кодом 302
Моим кодом 169
Запросом 59
   Serg_1960
 
104 - 18.02.21 - 16:56
(103) Это для кода, указанного в (39)?
   Garykom
 
105 - 18.02.21 - 16:56
(103) интересно в сравнении:

i5-8600k, sql, mssql
Кодом 302
Моим кодом 169
Запросом 59

1650v2, sql, postgres
Запросом 173
Кодом 168
Моим кодом 111

i7-6400T, файловая
Запросом 127
Кодом 198
Моим кодом 114
   Garykom
 
106 - 18.02.21 - 16:57
(105) тьфу перепутал
1650v2, файловая
Запросом 173
Кодом 168
Моим кодом 111

i7-6400T, серверная, postgres
Запросом 127
Кодом 198
Моим кодом 114
   Garykom
 
107 - 18.02.21 - 16:59
Короче хрень какая то в итоге.

Если база файловая то лучше кодом.
Если база серверная на mssql (или заточенном postgres) то запросом.
Если серверная на не заточенном дефолтном postgres - хз как лучше, тестить надо
   H A D G E H O G s
 
108 - 18.02.21 - 17:01
(105) А версия платформы?
   Serg_1960
 
109 - 18.02.21 - 17:05
+(104) Всё страньше и страньше! Всё чудесатее и чудесатее!

Проверил мой алгоритм и алгоритмы из (39) на клиенте:
Мой код 94

Запросом(39) 422
Кодом(39) 906
   H A D G E H O G s
 
110 - 18.02.21 - 17:06
(109) Толстый клиент щтоле?
   Serg_1960
 
111 - 18.02.21 - 17:07
(110) Угу. У меня же УПП :)
   H A D G E H O G s
 
112 - 18.02.21 - 17:08
(111) Ну так это толстый клиент, он мертв уже.
   Serg_1960
 
113 - 18.02.21 - 17:10
Пойду скажу юзверям, а то они не в курсе :)
   Garykom
 
114 - 18.02.21 - 17:11
(108) 8.3.18.1208
   H A D G E H O G s
 
115 - 18.02.21 - 18:47
Написал merg на Дельфи, быстрее чем 1С где то в 100 раз.
31 мсек на 100000 (не 10000) записей.

type
  УказательНаЗапись = ^ТипЗапись;

  ТипЗапись = record
    КолонкаСвязи: integer;
    КолонкаСвязиТаблицы2: integer;
  end;

implementation

{$R *.dfm}

function ФункцияСравнения(Объект1: Pointer; Объект2: Pointer): integer;
begin
  if УказательНаЗапись(Объект1)^.КолонкаСвязи > УказательНаЗапись(Объект2)^.КолонкаСвязи
  then
    Result := 1
  else if УказательНаЗапись(Объект1)^.КолонкаСвязи = УказательНаЗапись(Объект2)
    ^.КолонкаСвязи then
    Result := 0
  else
    Result := -1;
end;

procedure TForm2.Button1Click(Sender: TObject);
var
  Таблица1, Таблица2: TList;
  СтрокаТаблицы, СтрокаТаблицы1, СтрокаТаблицы2: УказательНаЗапись;
  ИндексТаблицы1, ИндексТаблицы2, Счетчик, ВремяНачала, ВремяОкончания: integer;
begin
  Таблица1 := TList.Create;
  Таблица2 := TList.Create;
  for Счетчик := 1 to 100000 do
  begin
    GetMem(СтрокаТаблицы, SizeOf(ТипЗапись));
    ZeroMemory(СтрокаТаблицы, SizeOf(ТипЗапись));
    СтрокаТаблицы^.КолонкаСвязи := Random(50000);
    Таблица1.Add(СтрокаТаблицы);

    GetMem(СтрокаТаблицы, SizeOf(ТипЗапись));
    ZeroMemory(СтрокаТаблицы, SizeOf(ТипЗапись));
    СтрокаТаблицы^.КолонкаСвязи := Random(50000);
    Таблица2.Add(СтрокаТаблицы);
  end;

  ВремяНачала := GetTickCount;

  Таблица1.Sort(ФункцияСравнения);
  Таблица2.Sort(ФункцияСравнения);
  ИндексТаблицы1 := 0;
  ИндексТаблицы2 := 0;
  while True do
  begin
    СтрокаТаблицы1 := Таблица1.Items[ИндексТаблицы1];
    СтрокаТаблицы2 := Таблица2.Items[ИндексТаблицы2];
    if True then
      if СтрокаТаблицы1^.КолонкаСвязи >= СтрокаТаблицы2^.КолонкаСвязи then
      Begin
        ИндексТаблицы2 := ИндексТаблицы2 + 1;
        if СтрокаТаблицы1^.КолонкаСвязи = СтрокаТаблицы2^.КолонкаСвязи then
          СтрокаТаблицы1^.КолонкаСвязиТаблицы2 := СтрокаТаблицы2^.КолонкаСвязи;
      End
      else
        ИндексТаблицы1 := ИндексТаблицы1 + 1;
    if ИндексТаблицы1 >= Таблица1.Count then
      break;
    if ИндексТаблицы2 >= Таблица2.Count then
      break;
  end;
  ВремяОкончания := GetTickCount;

  Memo1.Lines.BeginUpdate;
  Memo1.Lines.Clear;
  Memo1.Lines.Add('Время выполнения: ' + IntToStr(ВремяОкончания - ВремяНачала));
  Memo1.Lines.Add('КолонкаСвязи     КолонкаСвязиТаблицы2');
  for Счетчик := 1 to 100000 do
  begin
    СтрокаТаблицы := Таблица1.Items[Счетчик - 1];
    Memo1.Lines.Add(IntToStr(СтрокаТаблицы^.КолонкаСвязи)+'   '+IntToStr(СтрокаТаблицы^.КолонкаСвязиТаблицы2));
    FreeMem(СтрокаТаблицы);
    СтрокаТаблицы := Таблица2.Items[Счетчик - 1];
    FreeMem(СтрокаТаблицы);
  end;
  Memo1.Lines.EndUpdate;

end;
   Fragster
 
116 - 18.02.21 - 18:56
(112) не надо вот этого. торстый клиент с управляемыми формами вполне себе жив
   Garykom
 
117 - 18.02.21 - 20:05
(115) а терь добавь проверку лицензионности в цикле (как сча в 1С) и будет упс
   H A D G E H O G s
 
118 - 18.02.21 - 20:20
(117) Откуда дрова?
Собрал события LIC - ничего криминального.
   Garykom
 
119 - 18.02.21 - 20:36
(118) ключик выдерни во время длинного цикла ))
   H A D G E H O G s
 
120 - 18.02.21 - 20:55
(119) У меня проглицензии
   Bigbro
 
121 - 19.02.21 - 04:15
я конечно совсем не эксперт но реально разница ведь есть только при больших таблицах.
таблицы изначально на клиенте.
и если это не критически важная по времени операция смысла грузить ей сеть, сервер приложений, сервер бд - нет никакого. пусть клиент пыхтит себе тихонечко не мешая всем остальным работать. даже если это займет в 4 раза больше времени - нулевая нагрузка на общие ресурсы это оправдывает. я так это вижу.
   Галахад
 
122 - 19.02.21 - 04:55
Хм. Похоже не все так однозначно.
   Почему 1С
 
123 - 19.02.21 - 06:33
(122) Что не однозначно то, читаемость кода в (0) на порядок выше изобретения велосипедов что были ниже, надежность кода тоже на порядок выше, уже этого достаточно чтобы сделать выводы в пользу такого подхода.
   Галахад
 
124 - 19.02.21 - 06:43
(68) Обещанные тесты:

Алгоритм 1.
    Для каждого Стр Из Таблица1 Цикл
        НовСтр = Таблица2.Добавить();
        ЗаполнитьЗначенияСвойств(НовСтр, Стр);
    КонецЦикла; 
    
    Таблица2.Свернуть("КолонкиГруппировок", "КолонкиСуммирования");

Алгоритм 2.

    Т3 = ?(Т1.Количество() > Т2.Количество(), Т1.Скопировать(), Т2.Скопировать());
    Тх = ?(Т1.Количество() > Т2.Количество(), Т2.Скопировать(), Т1.Скопировать());
    Для к = 1 По Тх.Количество() Цикл Т3.Вставить(0); КонецЦикла;
    
    Для к = 0 По Тх.Колонки.Количество()-1 Цикл
        Имя = Тх.Колонки[к].Имя;
        Если Т3.Колонки.Найти(Имя) = Неопределено Тогда
            Т3.Колонки.Добавить(Имя, Тх.Колонки[к].ТипЗначения);
        КонецЕсли;
        Т3.ЗагрузитьКолонку(Тх.ВыгрузитьКолонку(Имя),Имя);
    КонецЦикла;

    Таблица2.Свернуть("КолонкиГруппировок", "КолонкиСуммирования");

Количество строк в таблице 1
Количество строк в таблице 2
Время алгоритм 1
Время алгоритм 2

Для таблиц с двумя колонками:
200 000
200 000
3 313
4 132

200 000
150 000
2 738
2 689

200 000
100 000
2 544
1 705

100 000
100 000
1 252
1 202

Для таблиц с тремя колонками группировок и 10 суммирования
200 000
100 000
3 314
4 281

200 000
50 000
3 033
2 126

100 000
50 000
1 709
1 553

50 000
40 000
791
985

50 000
30 000
780
725

100 000
70 000
1 614
2 255

50 000
40 000
803
960

50 000
30 000
771
731
   Галахад
 
125 - 19.02.21 - 07:05
(123) Ну если почитать ветку, сначала всё было однозначно, а потом мнения разделились.
   Почему 1С
 
126 - 19.02.21 - 07:15
(125) Соревнования что выполняется быстрее, в (0) результат сразу очевиден, все знают как работает левое соединение, то в коде хитрых манипуляций с таблицами надо посидеть и поразбираться, а будут ли увеличено количество строк в таблице1 если в таблице2 ей будет соответствовать несколько ключей и так далее.
   Волшебник
 
127 - 19.02.21 - 07:57
Извращенцы...
   Garykom
 
128 - 19.02.21 - 09:46
(127) Это в 1С разрабы платформы извращенцы, настолько умудриться затормозить исполнение кода что быстрей стало ТЗ на сервер SQL отправить и там соединить
   vi0
 
129 - 19.02.21 - 09:51
(128) просто разрабы ms sql профи в части оптимизации, это их экспертиза
   fisher
 
130 - 19.02.21 - 10:11
(129) Да-да. "Это не у нас плохо - это у них хорошо". То что язык 1С в разы (а местами и на порядок) более тормозной, чем другие скриптовые языки - как бы не тайна.
 
 
   Bigbro
 
131 - 19.02.21 - 10:12
в (124) нигде нет различия на порядок и даже в 2 раза... подобная разница не стоит затраченного на обсуждение времени.
   fisher
 
132 - 19.02.21 - 10:15
Кстати вспомнил, что отладка 1С существенно замедляет выполнение при большом количестве итераций. Поэтому корректнее сравнивать без включения отладки и замера производительности.
   Галахад
 
133 - 19.02.21 - 10:21
(131) Вроде именно эти методы и не обсуждали.
   vi0
 
134 - 19.02.21 - 10:30
(130) я говорю, что тот факт что скл сервер быстрый - это не только в сравнении с 1с, а то что это именно его особенность
1с не позионируется как быстрая система
   Конструктор1С
 
135 - 19.02.21 - 10:34
(4) обязательно и всегда. Нет ничего более постоянного, чем временное (с) К одноразовой обработке могут возвращаться снова и снова. И если у автора обработки ещё есть шанс расшифровать свой говнокод, то любой другой прогер будет обречен на муки
   olegves
 
136 - 19.02.21 - 10:35
(121) я конечно извиняюсь, но где ты видел таблицы значений на тонком (или вэб) клиенте?
   Garykom
 
137 - 19.02.21 - 10:40
(130) интересно если выяснится в итоге что платформа 1С специально заторможена... чтобы продавать "после корп" версию, которая "не тормозит" ))
   fisher
 
138 - 19.02.21 - 11:13
(137) Да не. Прежде всего арифметика медленная и по понятным причинам. А остальные тормоза объясняются незаморачиванием на оптимизациях.
   vi0
 
139 - 19.02.21 - 11:20
в 1с еще каждая строка кода дополняется какой то отладочной инфой
были обсуждения что код записанный в одну строку выполняется ненамного быстрее
   Hans
 
140 - 24.02.21 - 16:55
(115) На Делфи уже по русски можно писать?
  1  2

Список тем форума
 
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.