Имя: Пароль:
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С работала с иррациональными числами, поддерживая их ебанистическую точность в нетипизированных переменных, ессно тратя на это много ресурсов. Тогда типизация давала разительный эффект. Сабжевый случай совсем другой. Типизация тут эффекта не даст.
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа. Фредерик Брукс-младший