Имя: Пароль:
1C
1С v8
Складывать числа или сравнивать строки?
0 -Ze-
 
29.07.11
12:40
Вопрос исключительно касательно 1С 8. В связи с тем, что не смог найти каких-либо деталей реализации "примитивных" типов 1С, вопрос к тем, кто данный вопрос исследовал.
Собственно, вопрос:
Какая операция в 1С будет осуществляться эффективнее - СЛОЖЕНИЕ двух объектов типа "Число" или СРАВНЕНИЕ двух объектов типа "Строка" ("Число" ~ [10].[3], "Строка" ~ [20]), при том, что в строке сравнивается один символ на заданной позиции?
Еще раз повторюсь, что смущает именно неизвестность внутренней реализации данных типов. Может у кого-то есть подобная информация, был бы рад получить ссылку, к примеру. Спасибо.
1 Jstunner
 
29.07.11
12:41
других проблем совсем уже не осталось?
2 Irbis
 
29.07.11
12:41
Замер производительности на большом количестве даст приемлимый по точности ответ
3 Asmody
 
29.07.11
12:42
напиши два цикла: в первом сложи миллион чисел, во втором — сравни миллион строк.
4 Dirk Diggler
 
29.07.11
12:43
(1) 3д-шутер пишет.
5 -Ze-
 
29.07.11
12:43
Я тоже склоняюсь к эксперименту, но думал, может есть какая-то официальная информация от 1С по устройству этих "примитивных" типов.
6 Irbis
 
29.07.11
12:44
(5)Не думал что от длины строк и величины чисел может зависеть
7 Господин ПЖ
 
29.07.11
12:44
(5) ыыы... доступно и всерьез... главное на "" + 2 + 2 = "22" нормально реагировать и не забивать голову вопросами типа (0)
8 Axel2009
 
29.07.11
12:45
(0) а в чем выражается эффективность этих РАЗНЫХ операций по сути. точнее где сложение двух чисел можно заменить сравнением двух строк
9 Axel2009
 
29.07.11
12:46
(7) только как из 2+2 получить 22 непонятно
10 Wobland
 
29.07.11
12:47
(9) (2+2)*5.5=22
11 Axel2009
 
29.07.11
12:49
(10) тогда из "2" и "2" и "5.5" получаем "22"? без увеличений количества переменных..
12 kosts
 
29.07.11
12:49
(9) ""+2+2 = 22
13 Axel2009
 
29.07.11
12:50
(12) равно не будет
14 Wobland
 
29.07.11
12:51
(11) а переменные тут хде? СтрЗаменить("2"+"2"+"5.5", "5.5", "")
15 Axel2009
 
29.07.11
12:53
(14) а почему не СтрЗаменить("2"+"2"+"5.5", "2", ""). по какому критерию был сделан алгоритм работы?
16 Wobland
 
29.07.11
12:54
(15) ну мы ж "22" получаем? как ты в (11) просил
17 -Ze-
 
29.07.11
12:54
Irbis, наверное не зависит, учитывая, что, скорее всего, это сложные объекты.
Одному из алгоритмов поиска простых чисел в заданном диапазоне на С++ понадобилось около секунды, когда "одинэсу" не хватило 14 минут...

Axel2009, алгоритм суммирования по колонкам таблицы. Некоторые числовые столбцы надо складывать, в другие надо по итогам сумм первых записывать средние значения.
Либо суммируем все числовые столбцы (на каждой итерации), а потом затираем некоторые, вписывая в них средние значения, либо вносим признак в имя колонки, по которому в каждой итерации цикла проверяем, участвует ли данная колонка в сложении, или ее пропустить.
Возможно, алгоритм можно усовершенствовать. Прошу предлагать более оптимальные варианты.
18 kosts
 
29.07.11
12:59
Обработать все заранее в запросе , еще до получения первого появления "таблицы".
19 -Ze-
 
29.07.11
13:00
kosts, таблица - не прямой результат запроса, а результат длительных его преобразований.
20 dmpl
 
29.07.11
13:05
(19) Выгрузить ее в запрос и сложить все там.
21 kosts
 
29.07.11
13:07
(19) Может эти преобразования сразу в запросе сделать?
22 -Ze-
 
29.07.11
13:08
Я в 1С не профессионал, а руководствуясь общей терминологией программирования не понимаю, что значит "выгрузить в запрос".
23 -Ze-
 
29.07.11
13:09
kosts, может быть, но это, так сказать, "Большей кровью" обойдется :)
24 dmpl
 
29.07.11
13:12
(22)


ВЫБРАТЬ
   *    
ПОМЕСТИТЬ ВТВременнаяТаблица
ИЗ
   &Таблица КАК ВременнаяТаблица
;
25 kosts
 
29.07.11
13:13
(23) Зато явно быстрее отработает...
Напиши какие преобразования таблицы были, может тогда я помолчу :-)
26 ЗлобнийМальчик
 
29.07.11
13:14
(22) позовите специалиста тогда
27 0xFFFFFF
 
29.07.11
13:17
"таблица - не прямой результат запроса, а результат длительных его преобразований."
"Я в 1С не профессионал, а руководствуясь общей терминологией программирования не понимаю, что значит "выгрузить в запрос"."

Подозреваю, что тебе надо не фигней в (0) заниматься, а книжки по запросам почитать. Уверен, что твой "результат длительных преобразований" делатеся прям в запросе.
28 -Ze-
 
29.07.11
13:18
dmpl, ясно. Только за счет чего после "помещения в запрос" будет ускорение вычислений?

kosts, в двух словах: три запроса, каждый к одному регистру накопления, их результаты сворачиваются в одну таблицу, потом N функций навешивают на эту таблицу свои колонки и заполняют их.

ЗлобнийМальчик, если Вы считаете, что подобная задачка уже требует специалиста 1С, то мне жаль "специалистов 1С".
29 Rovan
 
гуру
29.07.11
13:20
(17) платформа 1C не для этого создавалась
30 kosts
 
29.07.11
13:21
(28) Один вложенный запрос в котором в соединении три регистра накопления. Не?...
31 Axel2009
 
29.07.11
13:22
(28) мне жаль тех людей которые пытаются выполнять задачи, которые не по их профилю. а еще больше жаль специалиста, который придет это исправлять.
32 dmpl
 
29.07.11
13:24
(28) 1. Практика показывает, что запросами быстрее, и клиент не грузится расчетами.

2. Что за N функций?

(30) Не, тут через ОБЪЕДИНИТЬ ВСЕ надо - во избежание дублирования строк.
33 -Ze-
 
29.07.11
13:25
Rovan, я понимаю конечно. Но ведь это частный случай операции с числами, не так ли?

kosts, да, но потом кучу колонок еще прицепить надо.

Axel2009, не переживайте, "исправлять" это никто не будет :).
34 Axel2009
 
29.07.11
13:28
(33) когда ЭТО будет считаться не пару часов, а пару недель, вот тогда придет исправлять. а того кто делал уже нетю, и никто не знает как это работает. в итоге специалист сидит и разбирается в коде, чтобы из ЭТОГО сваять быстрое, которое будет считать пару минут.
35 -Ze-
 
29.07.11
13:29
dmpl, запросы, насколько я понимаю, выполняются прямо на SQL-сервере, от этого и прирост производительности.
Касательно клиента, вопрос спорный, эти вычисления можно выполнить "НаСервере".
Функции, в большинстве случаев выполняющий запросы, и по их результатам добавляются колонки в общую таблицу.
36 -Ze-
 
29.07.11
13:30
Axel2009, никто не придет исправлять.
37 Господин ПЖ
 
29.07.11
13:31
(17) интерпретатор 1С быстротой не отличается - факт известный
38 -Ze-
 
29.07.11
13:32
Axel2009, 1С - это не Ассемблер, не Си, и даже не VB. "Разбираться в коде" в нем и в полноценном языке программирования - несравнимые задачи.
39 dmpl
 
29.07.11
13:33
(35) Ну так в чем проблема выполнять эти запросы прямо в запросе и левым соединением цеплять к существующей таблице? Для удобства эти запросы можно сделать в виде временных таблиц даже если они по 1 разу всего используются.
40 Axel2009
 
29.07.11
13:33
(35) что на клиенте, что на сервере, один фиг от этого вычисления в 1с не станут работать быстрее.
для того, чтобы вычисления работали быстрее их нужно переносить как минимум в рамки методов платформы 1с, что может существенно ускорить выполнение задачи. а еще лучше выкинуть это на сторону скуля, который может под себя и распараллелить задачу по процам.
(38) это вам так кажется, потому что язык программирования русский. забацайте все на английском языке и будете сидеть и разбираться также.
41 -Ze-
 
29.07.11
13:33
Господин ПЖ, но интерпретатор того же Питона затратил менее 2х минут
42 Axel2009
 
29.07.11
13:34
(41) интерпретатор 1с выполняет кучу левых подсчетов для каждой операции, чего не делает питон.
43 -Ze-
 
29.07.11
13:35
Axel2009, но зачем эти операции делать в одном цикле, если об их выполнении никто не просит... Понятно, такая "философия языка", наверное.
44 Rabbit
 
29.07.11
13:35
(0) пардон, а это взаимозаменяемые операции?
45 dmpl
 
29.07.11
13:36
(41) Я компилировать один исходник разными компиляторами C++. Получил разницу в скорости от 5 до 260 у.е.

Кроме того, числа в 1С не с плавающей запятой, так что сопроцессор их не считает. Это, скорее всего, отдельный класс с реализацией различных операций для таких чисел. Т.е., считай, программная эмуляция.
46 -Ze-
 
29.07.11
13:37
dmpl, да, я тоже так подумал, глядя на допустимые пределы значений типа "Число".
47 -Ze-
 
29.07.11
13:38
Всем спасибо за участие, попробуем разные подходы.
48 Axel2009
 
29.07.11
13:38
(43) потому что 1с пошли по пути, что прежде чем чтото сделать, нужно все проверить, а подходит ли каждый из операндов для операции. а так как в 1с намного больше типов, то и процесс этот намного затратней.
49 Rabbit
 
29.07.11
13:38
(47) ерундой не майся...
50 H A D G E H O G s
 
29.07.11
13:42
Ветку не читал.

С точки зрения логики - конечно сложение будет быстрее.

Только числа жестко типизируй!
51 Megas
 
29.07.11
13:46
(7) А ты хотел "Ошибку" ? Тебе дали инструмент неявного преобразования типов, а ты ещё нос воротишь!
52 Megas
 
29.07.11
13:47
(50) Жёсткая типизация чисел сильно увеличивает производительность?
53 Axel2009
 
29.07.11
13:47
(50) вот тут как раз и загвоздка. что при сложении типизированных чисел скорость обработки падает.. проверяли и даже результаты на мисту выкладывали. правда было это год-два назад..
54 dmpl
 
29.07.11
13:48
(47) Правильный подход: сделать 1 большой запрос, на выходе которого получить готовую к употреблению таблицу.

(50) Не факт - строки можно сравнивать по 4 UNICODE символа за такт процессора, а числа с фиксированной запятой - только по 1 цифре за такт складывать(и то только в том случае, если они нормально в памяти лежат, т.е. 1 цифра занимает 4 байта). BDC современные процессоры очень не любят.

А уж к секретным алгоритмам 1С приплетать логику... вообще не стоит. Практика - критерий истины.
55 Господин ПЖ
 
29.07.11
13:49
(47) экономите на спичках...
56 H A D G E H O G s
 
29.07.11
13:54
(52) На порядки. Готовьте переменные правильно.

   Описание=Новый ОписаниеТипов("Число",Новый КвалификаторыЧисла(15,2));
   РассовоВерноеЧисло=Описание.ПривестиЗначение(0);
57 H A D G E H O G s
 
29.07.11
13:56
(53) Нетипизированных.
Проверяли примерно год назад.

Только типизацию делали не как в (56), а через реквизиты формы.
58 Axel2009
 
29.07.11
14:00
ТЗ = Новый ТаблицаЗначений;
   ОписаниеТипаЧисло = Новый ОписаниеТипов("Число",Новый КвалификаторыЧисла(15,2));
   ТЗ.Колонки.Добавить("Число1", ОписаниеТипаЧисло);
   ТЗ.Колонки.Добавить("Число2");
   Строка = ТЗ.Добавить();
   Строка.Число2 = 0;
   ТекВр = ТекущаяДата();
   Для Сч = 0 По 1000000 Цикл
       Строка.Число1 = Строка.Число1 + 1;
   КонецЦикла;
   Сообщить("РазницаСекунд = " + Строка(ТекущаяДата() - ТекВр));
   
   ТекВр = ТекущаяДата();
   Для Сч = 0 По 1000000 Цикл
       Строка.Число1 = Строка.Число1 + ОписаниеТипаЧисло.ПривестиЗначение(1);
   КонецЦикла;
   Сообщить("РазницаСекунд = " + Строка(ТекущаяДата() - ТекВр));
   
   ТекВр = ТекущаяДата();
   Для Сч = 0 По 1000000 Цикл
       Строка.Число2 = Строка.Число2 + 1;
   КонецЦикла;
   Сообщить("РазницаСекунд = " + Строка(ТекущаяДата() - ТекВр));


РазницаСекунд (типизировано без привести) = 5
РазницаСекунд (типизировано с привести) = 6
РазницаСекунд (не типизировано) = 4

2 раза запускал, время одно и тоже. что делаю не так?
59 H A D G E H O G s
 
29.07.11
14:19
(58) Счаст померил - действительно нетипизированные быстрее.
wtf?

Счаст поищу ту ветку, повторю те условия.
60 Axel2009
 
29.07.11
14:29
вот 8.2
РазницаСекунд (типизировано без привести) = 65
РазницаСекунд (типизировано с привести) = 73
РазницаСекунд (не типизировано) = 63
еще все дольше.. хотя вроде замеры делали тогда, в 8.2 веселее работало.. странно =)
61 Axel2009
 
29.07.11
14:29
ЗЫ нулик добавил к каждому из циклу..
62 Rabbit
 
01.08.11
02:02
А вот нефиг в потроха "скриптовых языков" лазить, не для того они делались.
63 orefkov
 
01.08.11
08:26
(0)
В 8.2 внутреннее хранение числа и работа с числами не менялась еще с 7.7. Кому надо подробностей - смотрите класс CNumeric в исходниках 1С++.
Формат строк немного поменялся, но в-принципе несущественно - как была цепочка нультерминированных символов, так и осталась.
64 Ndochp
 
01.08.11
11:26
(63) формат ХЗ, а библиотека менялась. От самописки ушли во что-то лицензированное от IBM. в итоге были изменения в сортировке ("и" и "й" вроде считаются одной буквой в некоторых случаях). Значит и производительность могла поменяться довольно сильно.
65 fisher
 
01.08.11
11:47
(59) Там речь шла об вычислениях, когда 1С работала с иррациональными числами, поддерживая их ебанистическую точность в нетипизированных переменных, ессно тратя на это много ресурсов. Тогда типизация давала разительный эффект. Сабжевый случай совсем другой. Типизация тут эффекта не даст.
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший