◄ 1 2 |
1С:Предприятие
:: 1С:Предприятие 8 общая
|
|
| ||
Галахад 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 | |||
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 | |||
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 | |||
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 | |||
Галахад 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 |
Список тем форума |