Имя: Пароль:
1C
1С v8
Преобразование текста модуля в одну строку
0 Широкий
 
03.04.13
15:16
Занимаюсь оптимизацией.
Нужна обработка по форматированию.
98 IamAlexy
 
03.04.13
19:59
гы
99 Ursus maritimus
 
03.04.13
20:00
Какой только херней люди не занимаются чтобы не работать.
100 Кирпич
 
03.04.13
20:00
а еще есть секретные слова, которые можно вставлять в код, чтобы он ускорился на какое то время. но только он после такого ускорения потом какое то время очень медленно работает. видимо чтобы интерпретатор отдохнул.
101 IamAlexy
 
03.04.13
20:01
(0) автор, ты х.ней маешся а не оптимизацией занимаешся..

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


вот чем надо заниматься.. а не в строку загонять код модулей..
102 Кирпич
 
03.04.13
20:02
(101) да автора уже давно нету. остались только тролли.
103 TormozIT
 
гуру
03.04.13
20:03
(94) Да, действительно. Правда исправленный код дает еще бОльшую относительную разницу, т.к. лишняя операция содержалась в однострочном фрагменте.
104 Кирпич
 
03.04.13
20:05
(103) Ну чо будем делать? Предъявим 1С иск за зря потраченное электричество?
105 TormozIT
 
гуру
03.04.13
20:07
(104) Я рассматриваю проблему серьезно. Думаю есть шанс убедить производителя в оптимизации этих служебных действий интерпретатора при переходе к новой строке в опкоде.

Возможно orefkov посмотрит внутренности и скажет, есть ли там что ускорять.
106 Кирпич
 
03.04.13
20:13
(105)ну если у тебя есть шанс, то убеждай. а я миллиардные циклы в 1с не кручу. как то не случалось ещё. а если случиться, то я это буду делать не в 1с. ибо 1с все равно медленнее любого компилятора в сотни раз.
107 TormozIT
 
гуру
03.04.13
20:18
(106) Ну если никто не попытается, то шансы будут значительно ниже)
108 Escander
 
04.04.13
03:21
(101) может он и мается, но в процессе обсуждения я кое что новое узнал - так что тема полезная
109 Balabass
 
04.04.13
05:08
а=0;
Сообщить(ТекущееВремя());
Пока а<100000000 Цикл
а=а+1;
КонецЦикла;
Сообщить(ТекущееВремя());

а=0;Сообщить(ТекущееВремя());Пока а<100000000 Цикл а=а+1;КонецЦикла;Сообщить(ТекущееВремя());

а=0;message(текущеевремя());while а<100000000 do а=а+1;enddo;message(текущеевремя());

1. 63
2. 59
3. 58

Так то )))
110 Escander
 
04.04.13
05:17
(109) что ещё раз доказывает, что 1С оптимизируют в сторону англоговорящих.
111 Escander
 
04.04.13
05:56
(109) не поверишь:
а=0;
ее=текущаядата();
Пока а<100000000 Цикл
а=а+1;
КонецЦикла;
Сообщить(текущаядата()-ее);

а=0;ее=текущаядата();Пока а<100000000 Цикл а=а+1;КонецЦикла;Сообщить(текущаядата()-ее);


а=0;ее=текущаядата();while а<100000000 do а=а+1;enddo;message(текущаядата()-ее);


результат:
396,
44,
45
112 Balabass
 
04.04.13
07:18
хех...
113 Balabass
 
04.04.13
07:18
да как бы 2 и 3 вариант не показательны.
а вот 1 и 2/3 - да
114 Широкий
 
04.04.13
12:27
С чего я захотел так сделать:
http://infostart.ru/public/19753/

Старую версию когда переделал в одну строку - скорость чтения увеличилась на 20-30%
115 Кирпич
 
04.04.13
12:31
Прелестно
116 Гризли
 
04.04.13
12:31
(101) А ты неплохо информирован, как я погляжу. Или это все из головы придумано?
117 Кирпич
 
04.04.13
12:33
(114) Ну чего там партнерский форум говорит на счет наших чудо-тормозов?
118 fisher
 
04.04.13
12:54
(32) В принципе, это логично. Ведь отладчик и замер могут быть подключены в любой момент.
119 PCcomCat
 
04.04.13
13:08
(Упала с табуретки)

Люди добрые! А подскажите, как производите замер без отладчика?
120 PCcomCat
 
04.04.13
13:14
(120) Всё, не надо. Это от растерянности не сообразила.
121 TormozIT
 
гуру
04.04.13
13:31
(117) Пока там нет комментариев от производителя. Но есть несколько оппонентов, забрасывающих меня аргументами типа "по сравнению с обращением к БД это все мелочи".
122 fisher
 
04.04.13
13:35
(121) И они таки правы.
Развели бурю в стакане воды.
Очевидно, что интерпретатору необходим маркер строки. Очевидно, что на его отработку требуется дополнительное время.
Можно считать перевод строки дополнительным оператором.
123 TormozIT
 
гуру
04.04.13
13:43
(122) Это твое мнение.
Я же стараюсь опираться на факты

Примеры задач, решение которых будет чувствительно к такой оптимизации (естественно подразумевается без большого количества обращений к серверу БД):

   запросом выбираем большой объем данных из БД и выполняем его алгоритмическую обработку, которую в запросе делать невозможно или очень сложно
   рекурсивный поиск по дереву значений
   сложный анализ (разбор) текстов
   алгоритмы с высоким процентом математических операций (распределения сумм, хеш-функции и др.)
124 TormozIT
 
гуру
04.04.13
13:44
В моей практике было много задач, где вычисления длительное время выполнялись без обращения к БД.
125 TormozIT
 
гуру
04.04.13
13:53
Мои замеры наводят на мысль о том, что выполнение кода
"переменная1 = 343;"
длится столько же, сколько и обработка опкода "новая строка".

Кажется, что это довольно расточительно.
По логике опкод "новая строка" всего лишь должен внутренний счетчик строки модуля увеличить и проверить флаг "отладчик подключен". Может быть я забыл о чем то еще?
126 cw014
 
04.04.13
13:55
Обработка в одну строку:

Результат = СтрЗаменить(ИсходныйТекст, Символы.ПС, " ");
127 TormozIT
 
гуру
04.04.13
13:57
(126) Сломаешь многострочные строковые литералы (тексты запросов например).
128 NWsFF
 
04.04.13
14:00
Спасибо, узнал что-то новое сегодня.
129 fisher
 
04.04.13
14:03
(123) Чувствительны будут только большие итерации без обращений к БД. Кусочно такие можно надергать из контекста. Реально же рядом все равно будут обращения к БД и в итоге процентно фиг что выиграешь. При этом теряется возможность удобной отладки и замера.
Ну а кто занимается мегапарсингами и решением диф-уравнений численными методами средствами 1С - сам себе злобный буратино.
А то давай еще припомним особенности производительности арифметики 1С и какие чудеса оптимизации там возможны.
130 TormozIT
 
гуру
04.04.13
14:05
Хочу сделать акцент на том, что мне хотелось бы убрать соблазн у разработчиков прикладных решений писать большие фрагменты кода в одну строку. Т.е. сам прирост производительности конечно тоже был бы полезен, но вторичен.

Например, если программист будет писать разбор какого то текста средствами 1С, то там выигрыш от такого приема наверняка будет заметным. Поэтому если его попросят ускорить работу программы, то вполне вероятно что он решит применить такую оптимизацию. Однако потом дорабатывать ее будет очень неудобно.
131 Escander
 
04.04.13
14:16
(114) что там такое? Мне говорит что права у меня слабые что-бы читать...
132 Рэйв
 
04.04.13
14:25
(0)Потом твой приемник на рабочем месте(когда уволишься) подстережет тебя в темной подворотне и прострелит коленку.
И будет прав.
133 Гризли
 
04.04.13
14:25
(132) Представил прячущийся в подборотне приемник, сломал себе мозг.
134 Рэйв
 
04.04.13
14:27
(133)

Человек, замениший ТС на месте работы. Так не очень ломает ?:-)
135 be-may
 
04.04.13
14:34
(134) мне кажется, таких не увольняют. Такие люди становятся незаменимыми, ибо, после них никто не захочет работать.

по теме. Причитала. ИМХО, "экономия на спичках".

неужели кроме этого уже все оптимизировано ?
136 be-may
 
04.04.13
14:35
(135) Причитала -> ПрОчитала
137 Гризли
 
04.04.13
14:54
(134) Тогда пишется "преЕмник"
138 TormozIT
 
гуру
04.04.13
15:30
Производитель на партнерском форуме написал
"При компиляции 1С модулей, компилятор вставляет специальную команду перед первой выполняющейся инструкцией в строке исходного кода. Эта команда используется для служебных целей платформы, например обработки прерывания выполнения кода, работы отладчика и т.п. Обычно, обработка этой команды очень слабо влияет на производительность 1С кода."
139 samozvanec
 
04.04.13
15:33
(20) че там у тебя привязывается? ты когда ф10 жмешь, у тебя вся строка выполняется?)
140 fisher
 
04.04.13
16:07
(138) Так и есть. Мои замеры тоже показали, что маркер строки отрабатывается по времени примерно как простое присваивание переменной. Быстрее особо некуда.
Но фишка прикольная своей неочевидностью.
141 awa15
 
04.04.13
16:12
(138) Странно, но ты никогда не читал http://infostart.ru/public/71130/ ?
142 TormozIT
 
гуру
04.04.13
16:14
Производитель также сообщил, что
- при обработке опкода новой строки "на клиенте предотвращается "замерзание" интерфейса, а на сервере отслеживается потеря связи с клиентом и убитие соединения администратором"
- "Код "переменная1 = 342" практически ничего не делает, т.к. 342 это константа, сконструированная при компиляции модуля, а присваивание ее переменной очень дешевая операция."

Других пояснений по "служебным операциям" больше видимо не дадут.
143 fisher
 
04.04.13
16:20
На моем рабочем компе, чтобы время отработки 30-ти маркеров строки в цикле приблизилось к одной секунде, необходимо более полумиллиона итераций.
144 TormozIT
 
гуру
04.04.13
16:34
(141) Сейчас перечитал твои комменты там. Действительно, много полезной информации можно было бы получить сразу. Но теперь уже главная цель - предотвратить использование этого приема. Если не оптимизацией интерпретатора, то директивой компиляции.
145 awa15
 
04.04.13
16:41
(144) А не нужно директиву компиляции, по сути. Как мне это видится: надо сделать 2 режима запуска предприятия  - с возможностью отладки и без. В режиме без отладки компилировать без лишних кодов {1, x}. Подключаться конфигуратором можно только к сессиям, запущенным в режиме отладки.
146 Fish
 
04.04.13
16:45
(0) А я всегда думал, что оптимизация программы заключается прежде всего в оптимизации алгоритмов. А оказывается всё просто - переписал любой быдлокод в одну строку, и он сразу стал оптимальным :)
147 TormozIT
 
гуру
04.04.13
16:45
(145) Тогда ошибки в работающих сеансах будет сложнее диагностировать. Директива компиляции применялась бы ровно в тех местах, где прирост будет перевешивать неудобства отладки фрагмента.
148 notton
 
04.04.13
16:57
не делали замер когда в цикле вызываются функции, компиляция кода функции будет делаться при каждой итерации цикла?
149 notton
 
04.04.13
16:58
про этот прикол с текстом в одну строку давно знал, но интересует именно эта особенность
150 TormozIT
 
гуру
04.04.13
17:03
(145) Я так понимаю серверный код так и компилируется (ключ -debug включает удаление этих опкодов).
151 Reset
 
04.04.13
17:04
(148) Функция будет компилироваться только первый раз, при обращении к модулю, в котором она находится
152 awa15
 
04.04.13
17:18
(150) Подозреваю, что нет. Скорее всего этот ключ влияет только на прослушивание портов.
153 Reset
 
04.04.13
17:22
(150) Мне кажется, этот ключ только включает возможность общаться серверу и клиенту, а компиляция происходит одинаково
154 Reset
 
04.04.13
17:22
*серверу и отладчику
155 Reset
 
04.04.13
17:23
Что-то вроде, но не аналогично "Отладка в текущем сеансе разрешена" в Предприятии
156 orefkov
 
04.04.13
17:24
(126)
И помимо многострочных строк - весь текст модуля после первого комментария станет комментарием.
157 Ахиллес
 
04.04.13
17:24
(146) Ну если быдлоплатформа позволяет такую оптимизацию, то почему бы ей не воспользоваться? Если цикл написанный в 1 строку работает быстрее цикла написанного в три строки то это самая, что ни на есть быдлоплатформа.
158 BigShmax
 
04.04.13
17:25
у меня на рабочем сервере при убирании debug  происходит очень нехилый прирост.
159 Reset
 
04.04.13
17:27
Кстати, по сабжу - если не ошибаюсь, поставка модулей без исходных текстов удаляет эти доп команды
160 orefkov
 
04.04.13
17:29
(145)
Не получится.
Из-за вот этого "- при обработке опкода новой строки "на клиенте предотвращается "замерзание" интерфейса, а на сервере отслеживается потеря связи с клиентом и убитие соединения администратором".
Если убирать этот опкод, надо эти действия переносить куда-то в другое место. И этот перенос может потребовать серьезной переделки движка.
161 Джинн
 
04.04.13
17:40
(157) Быдлоплатформа.. И? Не обсуждаете ли Вы сейчас фому дворников, которые нарушают аэродинамику Феррари и приводят в повышению расхода топлива на 3 грамма на сотню километров?
162 Reset
 
04.04.13
17:43
+(156) Еще инструкции препроцессору должны быть каждая на отдельной строке :)
163 awa15
 
04.04.13
17:53
(159) Ошибаешься. Не удаляет.
164 Ахиллес
 
04.04.13
18:06
(161) Сам, я в такую оптимизацию не очень то верю и у себя такой хернёй заниматься не буду, но если у человека весь код вылизан и все остальные пути оптимизации исчерпаны, то почему бы и нет? :-)
165 Reset
 
04.04.13
18:22
(163) Да, похоже, что-то перепутал. Прошу прощения.
166 TormozIT
 
гуру
04.04.13
19:05
Также производитель сообщил, что "на клиенте предотвращается "замерзание" интерфейса, а на сервере отслеживается потеря связи с клиентом и убитие соединения администратором" не только при обработке этого опкода выполняется: "Платформа внутри своих механизмов, но не во всех, периодически делает эти служебные операции".
167 TormozIT
 
гуру
04.04.13
19:06
Т.е. удаление этих опкодов не совсем отключает "замерзание", но повышает вероятность этого, насколько сильно не уточняется, но думаю сильно.
168 TormozIT
 
гуру
04.04.13
19:07
(167) Ошибся.
Т.е. удаление этих опкодов не приведет к полному "замерзанию", но повышает его вероятность, насколько сильно не уточняется, но думаю сильно.
169 IamAlexy
 
04.04.13
19:13
я в детстве так свой код защищал..

модуль на 10500 строк просто клал в одну строку с помощью обработки специальной
через выгрузку/загрузку модуля

в результате платформа вставала раком если попытаться распарсить эту строку

на 8.1 было..
170 shpioleg
 
04.04.13
19:20
При написании генератора ходов в шахматах тоже пытался попробовать "прибавить скорости", свернув циклы в одну строку, и избавиться от вызова процедур. Но запуская из режима Предприятия, никакого прироста скорости выполнения не обнаружил. При отладке, конечно, выигрыш существенный.
171 awa15
 
04.04.13
19:38
(168) Действительно. Проверил только что на своем декомпиляторе. В процессе работы он выдает всякие сообщения в окно служебных сообщений и в статусную строку. В исходном состоянии (модуль обработки под паролем, коды 1 на месте) все работает, сообщения выводятся по ходу работы, статусная строка обновляется. В обфусцированном же состоянии (кроме всего прочего, из скомпилированного образа модуля выкинуты все коды 1) интерфейс замерзает почти сразу, ничего не меняется, и только в конце появляются все сообщения разом. Не обращал на это раньше внимания, спасибо, теперь буду знать!
172 TormozIT
 
гуру
04.04.13
20:04
Ну уже думаю можно подвести небольшие итоги исследования.
Удаление опкода новой строки (например через удаление символа перевода новой строки в исходном тексте) влечет
1. Значительное снижение частоты обработки оконных команд приложения.
2. Значительное снижение частоты контроля прекращения работы сеанса на сервере.
3. Серьезные сложности с отладкой кода.

Т.е. делать так имеет смысл только когда уже фрагмент хорошо отлажен и скорость его выполнения действительно перевешивает все эти негативные моменты.
173 Maxus43
 
04.04.13
20:08
(172) на партнёрке тебе вроде нормально написали из 1с чего и куда это влияет. на каждом форуме тема эта будет?)
174 TormozIT
 
гуру
04.04.13
20:17
(173) У большинства пользователей этого форума туда нет доступа. Кажется многим здесь интересно эта тема.
175 Maxus43
 
04.04.13
20:20
(174) тема интересна, не спорю, выкладывай уж ответ 1с тогда, там противоречие с (172) пункт 2 например, т.е. проверка прекращения сеанса привязана ещё и к серверным вызовам, т.е. цикл в одной строке где обращаемся к серверу - прервётся сразу всё равно, невзирая на то что всё в 1 строку
176 TormozIT
 
гуру
04.04.13
20:32
(175) В (172) в п. 2 имелось ввиду выполнение кода на сервере. Так что противоречия нет. По поводу цитирования ответов 1с в (142) я привел ответ, о котором ты пишешь.
177 Владимир1С
 
04.04.13
20:36
(176) Так что, до 20% ускорение гарантировано?
178 TormozIT
 
гуру
04.04.13
20:36
(177) Тролям да)
179 Maxus43
 
04.04.13
20:37
ну всё не читал)
Если честно - считаю Оптимизацию ТАКИМ путём - верх паранойи. Там задержки доли секунды, на РЕАЛЬНЫЕ алгоритмы из жизни - мало влияния, на типовых например, да и на других. Оптимизация алгоритмов и запросов даст больше профита чем это.
Есть конечно варианты экстремальной оптимизации, как например Фрагстер делал, раскладывал большую строку на подстроки с помощью ЗначениеИзСтрокиВнутр.
Есть резоны иногда, но НЕЧИТАЕМО абсолютно. В топку, есть намного актуальней проблемы производительности от неправильного проетирования, кривых запросов и быдлокода. Займёмся делом лучше, а не сомнительной оптимизацией
180 Владимир1С
 
04.04.13
20:38
(178) А по-русски?
181 TormozIT
 
гуру
04.04.13
20:39
(180) Если ты не троль, то нет. Ответ очень зависит от самого кода.
182 Владимир1С
 
04.04.13
20:39
(179) То есть после всех остальных действий, делаем одну строку, оставляя эталонную конфу в читабельном виде. так?
183 TormozIT
 
гуру
04.04.13
20:39
(179) Ну хотя бы на партнерском форуме то все читал? Видимо не все. Снова повторяю, что здесь не выигрыш в скорости интересен, а отбивание желания его получить таким извращенным путем.
184 Владимир1С
 
04.04.13
20:41
(179) :) Последний способ оптимизации перед покупкой нового железа %)
185 Владимир1С
 
04.04.13
20:42
(181) Чем проще код, тем ощутимее выигрыш. понято.
186 Maxus43
 
04.04.13
20:46
(183) я как раз подумал что ты хочешь именно такой способ использовать для повышения производительности, и есно не согласен. Что и говорили остальные на партнёрке)
187 Владимир1С
 
04.04.13
20:50
(186) При исчерпании всех остальных методов и наличия экономической целесообразности можно и это "чудо" применить. Руки то не отвалятся.
188 Maxus43
 
04.04.13
20:54
(187) чем бы дитя не тешилось, лишь бы не плакало (с)
очень сомнительно это "чудо"...
189 Владимир1С
 
04.04.13
20:55
(188) Последняя фора забывчивому сисадмину, чтобы успеть закупить новое железо :)
190 Maxus43
 
04.04.13
20:59
не видел пока админов, которым бы было интересно хватает ли железок 1-ске) за полгода не скажешь что пора брать новое - хрен чего закупят
191 Владимир1С
 
04.04.13
21:08
(190) Давай % от закупки админу - всегда будут самые новые железки :)
192 TormozIT
 
гуру
05.04.13
10:03
(150) Ошибочное преположение.
(152), (153)
Производитель на мой вопрос
"ключ -debug у рабочего процесса как то связан компиляцией или выполнением опкода новой строки?"
ответил, что
"При включенном debug режиме, отладчик может выполнять свои действия при выполнении опкода новой строки."

Хотя ответ в очередной раз очень лаконичен, но можно предположить, что опкод новой строки компилируется в обоих режимах, но в режиме debug его выполнение вызывает функцию обработки действий отладчика (есть ли подключенный отладчик).
193 Крутил_
Вертел_1С
 
08.04.13
05:34
Помню когда кодил долго на PHP, SQL вот там плясал над каждым байтом и над каждой миллисекундой.

Но делать тоже самое в 1С)))) как по мне маразм.... лучше смотреть в сторону процессов на машине, ПО и железа, чем сувать код модуля в одну строку.
194 Кирпич
 
08.04.13
19:03
(192) ты их спроси еще неплохо бы сделать свертку констант.
а то от людей стыдно.

"а = 100 + 200 + 300" будет выполнятся в два раза медленнее чем просто "а = 600"
195 SherifSP
 
09.04.13
18:09
Заметил что Условие "<>" быстрее отрабатывает, чем условие "Не ="
196 TormozIT
 
гуру
09.04.13
18:22
(195) Ну это понятно, т.к. количество операций (инструкций) 1 против 2.
197 Chin
 
09.04.13
18:31
Проверил :) Автор прав...

Цикл вида:
Для Цк=1 по 10000000 Цикл
  А = 1;
КонецЦикла

Выполняется 9 секунд

Тоже в одну строку:
Для Цк=1 по 10000000 Цикл А = 1; КонецЦикла;

Выполняется 5 секунд

Это без отладки. В отладке на порядок больше...
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс