Имя: Пароль:
1C
1С v8
Вопрос про быстродействие платфомы
,
0 fly7
 
13.01.12
11:44
Прочитал что если в модуле минимум строк, то он быстрее компилируется и в итоге быстрее работает 1с

как думаете имеет смысл перелопатить все модули в одну строку?
1 Wobland
 
13.01.12
11:45
подтверждаю, проверял
Для Цикл ... КонецЦикла
работает заметно быстрее, чем
Для Цикл
...
КонецЦикла

только тебе оно надо всё лопатить
2 Asmody
 
13.01.12
11:45
да, обязательно! а разве у тебя по другому?
3 Maxus43
 
13.01.12
11:46
имхо бред. даже если есть доля правды - прирост производительности будет оченьоченьочень мал, а вот читать этот код ты уже не сможеш
4 jsmith82
 
13.01.12
11:46
я уже давно перелопатил всю конфу, скорость возрасла в разы, блокнот и калькулятор нервно курят в сторонке
5 asady
 
13.01.12
11:47
(0) сабж спорный - но направление ваших мыслей мне нравится....
6 Fish
 
13.01.12
11:47
Главное -это "все модули в одну строку" - именно ВСЕ модули и в одну строку :)))
7 Maxus43
 
13.01.12
11:48
а, пятница же, ДА! всё УПП в одну строку переписал давно, летает просто
8 Asmody
 
13.01.12
11:49
1С специально типовые пишет с разбиением на строки, да ещё комментарии вставляет, чтобы снизить производительность. У них тайный сговор с продавцами компьютеров
9 БалбесВ1с
 
13.01.12
11:50
(0)Антон,где прочитал то? Дай ссылку.
10 jsmith82
 
13.01.12
11:50
кстати, вы черех хекс-редактор тоже убирали вставки из 1сv8.exe?
11 DmitryPavlik
 
13.01.12
11:50
(8) наверняка так!
а ещё пустые строки-разделители добавляют - якобы для облегчения понимания кода!
12 jsmith82
 
13.01.12
11:51
(11) больше всего тормозит из-за комментов, особенно если они зелёного цвета
13 Maxus43
 
13.01.12
11:51
(12) подтверждаю, у меня они черного щас, быстрей пашет
14 Asmody
 
13.01.12
11:51
(10) я его вообще сразу удаляю. без него производительность вырастает на порядок!
15 программистище
 
13.01.12
11:54
это сговор 1с с производителями железа
у них в типовых не только в одну строку, но и через каждую строку пустая строка
16 petrowsky
 
13.01.12
11:55
(0) быстрее всего будет, если вообще от кода избавиться, я гарантирую
17 DmitryPavlik
 
13.01.12
11:55
(16) как раз хотел предложить этот способ
может быт даже вообще платформу не запускать...
18 jsmith82
 
13.01.12
11:56
или удалить вообще с компа, так наверно быстрее всего будет работать
19 jsmith82
 
13.01.12
11:56
как Asmody
20 Maxus43
 
13.01.12
11:57
быстрей будет на счетах, компьютеры и 1с от лукавого
21 DmitryPavlik
 
13.01.12
11:57
(18) оставить голый ДОС, как у Asmody ?
22 Asmody
 
13.01.12
11:57
(21) у меня вообще-то убунта
23 fly7
 
13.01.12
11:57
(9) это на секретном форуме разрабов платформы, вас не пустит
24 DmitryPavlik
 
13.01.12
11:58
(22) для нетбуков - только кде :)
25 Asmody
 
13.01.12
11:58
(24) у меня айпад
26 IamAlexy
 
13.01.12
11:58
вы главное незабудьте убрать из этой строки все лишние пробелы, комментарии и тд и тп..
27 petrowsky
 
13.01.12
11:58
(20) согласен, компьютеры, программы - все это маркетинговые махинации
28 Artem_Na
 
13.01.12
12:04
(0) Это справедливо для 1С 7.7 -- там внутренний опкод 01 (LINE) использовался для нужд отладчика/анализа производительности. Как в 1С 8.x -- не знаю.
29 Wobland
 
13.01.12
12:13
// вариант 1
Старт=обMSScriptControl.eval("new Date().getTime()");
Для й=0 По 1000000 Цикл
   й=й;
КонецЦикла;
Финиш=обMSScriptControl.eval("new Date().getTime()");
Сообщить("Вариант 1: "+(Финиш-Старт)/1000+" сек.");

// вариант 2
Старт=обMSScriptControl.eval("new Date().getTime()");
Для й=0 По 1000000 Цикл й=й; КонецЦикла;
Финиш=обMSScriptControl.eval("new Date().getTime()");
Сообщить("Вариант 2: "+(Финиш-Старт)/1000+" сек.");
=====================================
Вариант 1: 14,722 сек.
Вариант 2: 1,125 сек.
Вариант 1: 14,143 сек.
Вариант 2: 1,203 сек.
Вариант 1: 14,175 сек.
Вариант 2: 1,156 сек.
30 jsmith82
 
13.01.12
12:15
Для и=1 по 1000 цикл ТелоЦикла(); КонецЦикла;
31 jsmith82
 
13.01.12
12:16
в общем идея понятна, любое  тело цикла обрамлять в отдельную процедуру
32 GROOVY
 
13.01.12
12:17
(0) Вот так новичкам лапшу и навешивают :)
33 hhhh
 
13.01.12
12:20
(29) точка с запятой ведь не нужна. Попробуй

Для й=0 По 1000000 Цикл й=й КонецЦикла;
34 Wobland
 
13.01.12
12:27
(33) пошутил? монописуально

Вариант 1: 14,252 сек.
Вариант 2: 1,156 сек.
35 GROOVY
 
13.01.12
12:27
(34) А вы тут что на полном серьезе это обсуждаете?!
36 Cube
 
13.01.12
12:28
(35) +1. Я вот тоже насторожился))
37 Wobland
 
13.01.12
12:28
(35) я не знаю, я выпал из разговора ;)
38 БалбесВ1с
 
13.01.12
12:29
(35)Что так всполошился? Твой секрет раскрыт!
39 Турбо
 
13.01.12
12:30
"Секреты программирования в 1с" )))
40 GROOVY
 
13.01.12
12:33
(38) О каком секрете идет речь? Я офигеваю от того что топик реально кто то всерьез может воспринимать.
41 МуМу
 
13.01.12
12:33
(0) Бред что бы это обсуждать серьезно.
42 Cube
 
13.01.12
12:35
Блин, реально... Код обработки:

Процедура КнопкаВыполнитьНажатие(Кнопка)
   
   обMSScriptControl = Новый COMОбъект("MSScriptControl.ScriptControl");
   обMSScriptControl.Language = "javascript";
   
   // вариант 1
   Старт=обMSScriptControl.eval("new Date().getTime()");
   Для й=0 По 1000000 Цикл
       й=й;
   КонецЦикла;
   Финиш=обMSScriptControl.eval("new Date().getTime()");
   Сообщить("Вариант 1: "+(Финиш-Старт)/1000+" сек.");
   
   // вариант 2
   Старт=обMSScriptControl.eval("new Date().getTime()");
   Для й=0 По 1000000 Цикл й=й; КонецЦикла;
   Финиш=обMSScriptControl.eval("new Date().getTime()");
   Сообщить("Вариант 2: "+(Финиш-Старт)/1000+" сек.");
   
КонецПроцедуры //КнопкаВыполнитьНажатие()


Результаты:

Вариант 1: 7,35 сек.
Вариант 2: 0,587 сек.
Вариант 1: 7,207 сек.
Вариант 2: 0,587 сек.
43 Wobland
 
13.01.12
12:35
(40) модули лопатить, конечно, бред, а вот вырост производительности на порядок достойно внимания
44 decdmb
 
13.01.12
12:36
Никто не в курсе, 1С планирует добавить в язык asm-вставки??? ;P
45 GROOVY
 
13.01.12
12:37
Без отладки ктонить тестил?
46 Cube
 
13.01.12
12:37
(42) Я в шоке... Где подвох? о_О
47 decdmb
 
13.01.12
12:38
(45)
Вариант 1: 0,757 сек.
Вариант 2: 0,526 сек.
48 Cube
 
13.01.12
12:38
(45) Без отладки. Рабочая база на SQL:

Вариант 1: 1,076 сек.
Вариант 2: 0,573 сек.
Вариант 1: 1,03 сек.
Вариант 2: 0,577 сек.
Вариант 1: 1,045 сек.
Вариант 2: 0,593 сек.
49 Cube
 
13.01.12
12:49
Так это, че делать-то будем?)) Групповую обработку текстов модулей?)))))
50 H A D G E H O G s
 
13.01.12
12:53
Отключайте отладчик.
51 GROOVY
 
13.01.12
12:53
Давайте проясним.
1С это платформа-интерпретатор с предварительной компиляцией. по сути скриптовый язык который из ЧПЯ скрипт переписывает в свой формат (СФ). В СФ игнорируются пробелы, переносы, комментарии и прочая хня... => скорость выполнения может меняться только на этапе предварительной компиляции. Все.
Кто видел СФ меня поймет. кто не видел - советую создать обработку, запаролить ее модуль и покурить в сторону блокнота++ для медитации.
52 Cube
 
13.01.12
12:56
(50) Читай (48).
53 hhhh
 
13.01.12
12:58
(52) ну вообще-то по сравнению с запросами эта прибавка - такой мизер, что не парься даже.
Эти циклы занимают 0,0001% от общего времени выполнения кода, а будут занимать 0,00001%.
54 DmitrO
 
13.01.12
13:10
1С во время работы модуля, между отработкой каждой строки проверяет очередь сообщений на предмет сообщений WM_PAINT и WM_NCPAINT и если они там есть, то диспатчит их (собственно выполняет отрисовку). Это сделано для того, чтобы окно приложения не "замерзало".
Косвенным подтверждением этого предположения может быть пропорциональное увеличение разницы в замерах с увеличением количества отрисовок.
55 kosts
 
13.01.12
13:12
(0) Тестирование на более реальной задаче

Тест
Обработано 1 155 записей
Вариант 1: 11,749 сек.
Обработано 1 155 записей
Вариант 2: 11,688 сек.
Тест
Обработано 1 155 записей
Вариант 1: 12,203 сек.
Обработано 1 155 записей
Вариант 2: 11,765 сек.
Тест
Обработано 1 155 записей
Вариант 1: 11,781 сек.
Обработано 1 155 записей
Вариант 2: 11,703 сек.


Процедура КнопкаВыполнитьНажатие(Кнопка)
   
   Сообщить("Тест", СтатусСообщения.Информация);
   
   обMSScriptControl = Новый COMОбъект("MSScriptControl.ScriptControl");
   обMSScriptControl.Language = "javascript";

   Запрос = Новый Запрос;
   Запрос.Текст = "ВЫБРАТЬ
   |    СотрудникиОрганизаций.Наименование,
   |    СотрудникиОрганизаций.Ссылка
   |ИЗ
   |    Справочник.СотрудникиОрганизаций КАК СотрудникиОрганизаций"
   ;

   Результат = Запрос.Выполнить();
   
   // вариант 1

   Старт=обMSScriptControl.eval("new Date().getTime()");
   Выборка = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
   к = 0;
   Пока Выборка.Следующий() Цикл
       к = к + 1;
       Об = Выборка.Ссылка.ПолучитьОбъект();
       Об.Наименование = Выборка.Наименование;
       Об.Записать();
       Состояние(к);
   КонецЦикла;
   Сообщить("Обработано " + к + " записей", СтатусСообщения.Информация);
   Финиш=обMSScriptControl.eval("new Date().getTime()");
   Сообщить("Вариант 1: "+(Финиш-Старт)/1000+" сек.");

   // вариант 2
   
   Старт=обMSScriptControl.eval("new Date().getTime()");
   Выборка = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);к = 0;Пока Выборка.Следующий() Цикл к = к + 1;Об=Выборка.Ссылка.ПолучитьОбъект();Об.Наименование=Выборка.Наименование;Об.Записать();Состояние(к);КонецЦикла;
   Сообщить("Обработано " + к + " записей", СтатусСообщения.Информация);
   Финиш=обMSScriptControl.eval("new Date().getTime()");
   Сообщить("Вариант 2: "+(Финиш-Старт)/1000+" сек.");    

КонецПроцедуры


Вижу что очень мало смысла все пихать в одну строку.
56 kosts
 
13.01.12
13:15
Еще интересно проверить выполнение на сервере...