Имя: Пароль:
1C
1С v8
Функция СтрПолучитьСтроку
,
0 kisskiss
 
30.01.13
13:25
Анализ быстродействия кода показал, что 70% времени тратится на функцию СтрПолучитьСтроку(Текст,й); Можно ли эту функцию чем-то заменить, чтобы ускорить код ?
1 ОбычныйЧеловек
 
30.01.13
13:26
(0)Если весь код состоит только из этой строки то логично, что 70% времени тратится на нее.
2 kisskiss
 
30.01.13
13:27
В коде 1062 строки
3 Ayvengo
 
30.01.13
13:27
(0) а какая задача в целом?
4 kosts
 
30.01.13
13:30
Последовательное чтение текста
5 kisskiss
 
30.01.13
13:31
В целом - обработка упрощающая обновление конфигурации.
В данном случае задача стоит такая: берем код модуля и разбиваем его на функции, чтобы получилась таблица значений в формате Имя функции - код функции.   СтрПолучитьСтроку  используется для построчного прочтения кода
6 ОбычныйЧеловек
 
30.01.13
13:31
(2) Вот ни о чем не говорит кол-во строк в коде...там может в первых 3х строчках возврат стоит с обработкой этой строки...Может у тебя в тексте миллион строк - вот долго и читает.
7 Wobland
 
30.01.13
13:32
регвыражения помогут найти функции
8 Privalov
 
30.01.13
13:32
(0) Дурной вопрос, может стоит переформулировать?
9 Fragster
 
гуру
30.01.13
13:32
(4) замени на чтение текста
10 Ayvengo
 
30.01.13
13:32
(5) Попробуй использовать Текстовый документ вместо Строки.
11 Fragster
 
гуру
30.01.13
13:32
чтениетекста
12 Живой Ископаемый
 
30.01.13
13:33
не используй объект Текст, используй ЧтениеТекста.
13 kisskiss
 
30.01.13
13:33
(6) Мне нужен код всего модуля, для последующего сравнения кода модуля в старой типовой конфигурации, новой и нашей на 50% нетиповой.
Строк действительно может быть очень много в модуле
14 kisskiss
 
30.01.13
13:34
(8) нет
15 Privalov
 
30.01.13
13:34
(13) Нужен, берите, в чем вопрос?
16 Ayvengo
 
30.01.13
13:35
Хе, а девочки на мисте все с фотографиями ибо знают, что красивым поможем :D
17 Fragster
 
гуру
30.01.13
13:35
(13) поставь на поддержку, тогда там 3 конфы можно сравнить - конфигурация поставщика, конфигурация БД, загружаемая  конфигурация
18 kisskiss
 
30.01.13
13:36
(10) (12) Думаете, что работа с файлами будет быстрее чем работа со строкой?
19 Ayvengo
 
30.01.13
13:37
(18) а зачем файл?:)
20 kisskiss
 
30.01.13
13:37
(17) нельзя на поддержку - 50% нетипового кода и редактируется с сохранением поддержки
21 Живой Ископаемый
 
30.01.13
13:37
2(18) Тетка, мы не думаем. мы пробуем и засекаем. И вам рекомендуем.
22 Fragster
 
гуру
30.01.13
13:37
(21) а чО тетка? вполне себе симпатичная девушка на фото...
23 Maxus43
 
30.01.13
13:38
(21) девушка уж тогда)
24 Живой Ископаемый
 
30.01.13
13:38
2(22) все Недядьки - этот тетки
25 mrParadox
 
30.01.13
13:40
(21) Ухахахаха, 5 балов
26 kisskiss
 
30.01.13
13:40
(21) ЧтениеТекста не пойдет, ибо потом опять чтение данного текста идет как при работе со строкой. В Хелпе написан пример:

Текст = Новый ЧтениеТекста("d:\win.txt", КодировкаТекста.ANSI);
Стр = Текст.ПрочитатьСтроку();
Пока Стр <> Неопределено Цикл // строки читаются до символа перевода строки
   Сообщить(Стр);
   Стр = Текст.ПрочитатьСтроку();
КонецЦикла;

Так что это тоже самое, только вид сбоку :)
27 Maxus43
 
30.01.13
13:40
"некоторые дяденьки иногда совершают ошибку и спят с чужими тетеньками , у которых между прочим тоже есть свои дяденьки , но пока их тетеньки спят с другими дяденьками , эти дяденьки спят с чужими тетеньками" (с)
28 Fragster
 
гуру
30.01.13
13:40
(26) нет, там будет последовательное чтение, а СтрПолучитьСтроку - прыгает по индексу
29 Ayvengo
 
30.01.13
13:41
(26) наивненькая :)
30 kisskiss
 
30.01.13
13:42
(29) в смысле ?
31 Живой Ископаемый
 
30.01.13
13:42
2(26) Понятно, то есть на форум пришла не спрашивать и пробовать, а умничать и отвергать советы.
32 Живой Ископаемый
 
30.01.13
13:43
2(30) В смысл, чтобы делать подобные заключения, нужно пробовать. А если не пробовать и делать подобные заключения - уподобляться тупой дуре.
33 Maxus43
 
30.01.13
13:44
агрессивный какой ископаемый сёдня
34 Ayvengo
 
30.01.13
13:44
(30) СтрПолучитьСтроку и ПрочитатьСтроку() разные функции работают с разными объектами, что уже должно навести на мысль, что работают по другому. Пробуй, заечка :) Потом расскажешь. Не попробовал не получишь результата ;)
35 mrParadox
 
30.01.13
13:44
Женоненавистник
36 ОбычныйЧеловек
 
30.01.13
13:44
(5) А каким образом получили ТЗ? (просто интересно).Ну допустим ТЗ есть - потом ее в текст пишите, что ли? а потом обратно из текста читаете?
37 Живой Ископаемый
 
30.01.13
13:46
2(33,35) почему? я ведь никого не называю тупой дурой.
38 Живой Ископаемый
 
30.01.13
13:47
Сейчас у ТС есть выбор. или попробовать, или оставаться в позе.
39 GANR
 
30.01.13
13:53
(0) Может помогут функции работы со строками Найти, СтрЗаменить и Сред ???
40 GANR
 
30.01.13
13:54
Текст = Новый ЧтениеТекста("d:\win.txt", КодировкаТекста.ANSI);
Стр = Текст.ПрочитатьСтроку();
Пока Стр <> Неопределено Цикл // строки читаются до символа перевода строки
   Сообщить(Стр);
   Стр = Текст.ПрочитатьСтроку();
КонецЦикла;
41 kisskiss
 
30.01.13
13:56
(32)(34)  Погодите, пробую замерить время с ПрочитатьСтроку()...
42 Живой Ископаемый
 
30.01.13
13:56
2(40) Зачем прочитать строку? почему не Прочитать()?
43 GANR
 
30.01.13
13:57
(42) Тьху-ё кривой пример из справки

Текст = Новый ЧтениеТекста("d:\win.txt", КодировкаТекста.ANSI);
Стр = Текст.Прочитать();
Пока Стр <> Неопределено Цикл // строки читаются до символа перевода строки

   Сообщить(Стр);
   Стр = Текст.Прочитать();
КонецЦикла;
44 GANR
 
30.01.13
13:58
(41) Смотри (43)
45 Живой Ископаемый
 
30.01.13
13:58
2(43) тоже кривой
46 GANR
 
30.01.13
13:59
А нееееет... Текст.Прочитать() либо до прямо указанной позиции, либо до конца файла читает - поэтому (40)
47 Ayvengo
 
30.01.13
14:00
Ребята, а нафига вообще файл какой-то использовать? =\
48 GANR
 
30.01.13
14:01
(47) Потому что нет функции, которая последовательно считывает строку из оперативы
49 Ayvengo
 
30.01.13
14:02
(48) на, пробуй https://www.dropbox.com/s/2k6zdbvwjc5bkku/СравнениеЧтенияСтроки.epf специально для вас сделал :)
50 Ayvengo
 
30.01.13
14:03
   СтрокаТекста = ПолучитьСтрокуТекста();
   ЧислоСтрок = СтрЧислоСтрок(СтрокаТекста);
   Счетчик = 1;
   Сообщить("Работа со строкой начата:");
   Сообщить(ТекущаяДата());
   Пока Счетчик <= ЧислоСтрок Цикл
       Значение = СтрПолучитьСтроку(СтрокаТекста, Счетчик);
       Счетчик = Счетчик + 1;
   КонецЦикла;
   Сообщить(ТекущаяДата());
   
   ТД = Новый ТекстовыйДокумент;
   Сообщить("Работа с текстовым документов начата:");
   Сообщить(ТекущаяДата());
   ТД.УстановитьТекст(СтрокаТекста);
   ЧислоСтрок = ТД.КоличествоСтрок();
   Счетчик = 1;
   Пока Счетчик <= ЧислоСтрок Цикл
       Значение = ТД.ПолучитьСтроку(Счетчик);
       Счетчик = Счетчик + 1;
   КонецЦикла;
   Сообщить(ТекущаяДата());


Если мы работает со строкой, то работает ппц долго. Если с ТД, выполняется моментально. Проверял на 18т строк.
51 Sammo
 
30.01.13
14:08
Быстрее всего с текстом работать через ЧтениеТекста. Если последовательное чтение строк устраивает.
+ самый экономичный вариант по памяти.
52 GANR
 
30.01.13
14:09
(0)(50) С тектовым документом дает выигрыш в 400 раз при чтении строки.
53 kisskiss
 
30.01.13
14:10
Все..готово... вместо 70% теперь сократилось до 1% (картинко: http://pikucha.ru/ia4T0). Ускорение явно чуствуется. Всем спасибо

(48) спасибо за обработку
пы сы: классную строку ты в ней написал :)
54 kisskiss
 
30.01.13
14:11
Скобка к адресу присоединилась:( вот корректный адрес:
http://pikucha.ru/ia4T0
55 Ayvengo
 
30.01.13
14:13
(53) всегда пожалуйста ;)
56 GANR
 
30.01.13
14:27
Кстати, через файл по скорости то же самое получается, что и через текстовый документ. Это так, к слову ;).

&НаКлиенте
Процедура Команда1(Команда)
   
   // СтрПолучитьСтроку
   СтрокаТекста = ПолучитьСтрокуТекста();
   ЧислоСтрок = СтрЧислоСтрок(СтрокаТекста);
   Счетчик = 1;
   Сообщить("Работа со строкой начата:");
   Сообщить(ТекущаяДата());
   Пока Счетчик <= ЧислоСтрок Цикл
       Значение = СтрПолучитьСтроку(СтрокаТекста, Счетчик);
       Счетчик = Счетчик + 1;
   КонецЦикла;
   Сообщить(ТекущаяДата());
   
   // ТекстовыйДокумент
   ТД = Новый ТекстовыйДокумент;
   Сообщить("Работа с текстовым документов начата:");
   Сообщить(ТекущаяДата());
   ТД.УстановитьТекст(СтрокаТекста);
   ЧислоСтрок = ТД.КоличествоСтрок();
   Счетчик = 1;
   Пока Счетчик <= ЧислоСтрок Цикл
       Значение = ТД.ПолучитьСтроку(Счетчик);
       Счетчик = Счетчик + 1;
   КонецЦикла;
   Сообщить(ТекущаяДата());
   
   // через файл
   Текст = Новый ЗаписьТекста("D:\win.txt", КодировкаТекста.ANSI);
   Сообщить("Работа с файлом начата:");
   Сообщить(ТекущаяДата());    
   Текст.Записать(СтрокаТекста);
   Текст.Закрыть();
   
   Текст = Новый ЧтениеТекста("D:\win.txt", КодировкаТекста.ANSI);
   Стр = Текст.ПрочитатьСтроку();
   Пока Стр <> Неопределено Цикл // строки читаются до символа перевода строки
       Стр = Текст.ПрочитатьСтроку();
   КонецЦикла;    
   Текст.Закрыть();
   Сообщить(ТекущаяДата());
   
КонецПроцедуры
57 Ayvengo
 
30.01.13
14:27
(56) только нужно файл создавать, лишнее действие ;)
58 Ayvengo
 
30.01.13
14:28
Вдруг прав нет или еще какие-то проблемы. Хотя во временный каталог без проблем можно. НО зачем вообще что-то сохранять где-то ;)
59 Широкий
 
30.01.13
14:30
(0)Регулярки предлагать?
60 GANR
 
30.01.13
14:31
(57) Ну да. (58) Может дать выигрыш в оперативной памяти если тект ОЧЕНЬ большой.
61 Fragster
 
гуру
30.01.13
14:31
(58) ну, мне почему-то кажется, что в контексте анализа текстов модулей - они и так предварительно были выгружены в файл...
62 GANR
 
30.01.13
14:32
+(60) Хотя не факт - мы не знаем как ТекстовыйДокумент и ЧтениеТекста используют ресурсы.
63 GANR
 
30.01.13
14:33
(61) Тоже может быть
64 Широкий
 
30.01.13
14:33
(60) ТекстовыйДокумент  читается файл послностью - соответственно оперативки сжигает..
Чтение читает файлик последовательно
65 GANR
 
30.01.13
14:34
(64) Так ДОЛЖНО быть, но как это в платформе сделано?
66 Ayvengo
 
30.01.13
14:34
(63) сделай в (56) ПолучитьСтрокуТекста и там 100т строк ;)
67 Sammo
 
30.01.13
14:36
(62) Текстовый документ - это объект в памяти. Чтение текста - это fso
попробуй загрузить текстовый файлик в сотню мегабайт через текстовый документ - поймешь разницу :)
68 acsent
 
30.01.13
14:41
сколько раз выполняется данная функция для модуля из 100 строк (ну допустим 5 функций)?
69 GANR
 
30.01.13
14:42
(66) То же самое, вот только Счетчик = Счетчик + 1 с текстовым документом увеличивает время в 1,5 раза ;)
(67) Если так - то хвала Аллаху. А то при выводе картинок в табличный документ с последующим его закрытием эти картинки так и остаются висеть в памяти, к примеру. Далеко не всё так рационально в платформе.
70 GANR
 
30.01.13
14:44
(68) 100 строк - не показатель
71 acsent
 
30.01.13
14:46
(70) это для прикидки на опитмальность алгоритма. вдруг он 10 тыщ раз вызывается
72 Ayvengo
 
30.01.13
14:52
(68) 100т = 100 тысяч ;) или 1млн попробуй :) Хотя я таких модулей в 1Ске не видел на млн строк :)
73 GANR
 
30.01.13
15:05
(72) С файлом быстрее. Кстати, в (69) я ошибся - текстовую строку неправильно расфлудил.
74 GANR
 
30.01.13
15:07
(72) Конфигуратор повестися :)
75 Ayvengo
 
30.01.13
15:09
(69) сделай Для Счетчик = 1 По КоличествоСтрок Цикл :)
76 Fragster
 
гуру
30.01.13
15:10
конструкция вида Переменная = Переменная + Значение очень неоптимальна с точки зрения микрооптимизаций, особенно когда идет работа со строками. для чисел можно ускорить если сделать переменную "типизированной", например добавив переменную в реквизиты формы или обработки
77 Fragster
 
гуру
30.01.13
15:11
(76) естественно, речь про циклы во много итераций
78 Eugene_life
 
30.01.13
15:12
ТС уже удалилась, а возбужденные 1С-ники еще долго гудели и сыпали терминами...
79 GANR
 
30.01.13
15:21
(75) 500т строк. 30 секунд ТекстовыйДокумент против ЧтениеТекста
http://files.mail.ru/3F50DF7F93664F778255E1FE0D4575E3
80 GANR
 
30.01.13
15:21
30 против 3
81 GANR
 
30.01.13
15:32
(78) У ТС цель - решить насущную задачку, а у Ayvengo и GANR исследовательский интерес.
82 Ayvengo
 
30.01.13
15:36
Работа с текстовым документов начата:
30.01.2013 15:32:35 - начало
30.01.2013 15:32:52 - окончание
Работа с файлом начата:
30.01.2013 15:32:52 - начало (запись)
30.01.2013 15:32:52 - начало (обработки)
30.01.2013 15:32:56 - окончание

Да, второй вариант интереснее по скорости, но для очень больших размеров текста. Для небольших 10000 строк, не видно особой разницы ;) Что не скажешь о СтрПолучитьСтроку - работает всегда медленно :)