Имя: Пароль:
1C
1С v8
Строка в миллион символов
0 Fragster
 
модератор
26.07.13
14:52
Запустил код:

А = "";
Для сч = 1 по 1000000 Цикл
  А = А + "ф";
КонецЦикла;

Вот уже минут 5 работает...
а 100000 за 10 секунд обработал.
1 H A D G E H O G s
 
26.07.13
14:52
И?
2 Maxus43
 
26.07.13
14:53
(0) индикатор бы вывел на форму, или Состояние. Увидел бы с какого места начинает "тормозить"
3 Жан Пердежон
 
26.07.13
14:53
Продолжайте наблюдения
4 Fragster
 
модератор
26.07.13
14:53
(1) почитал http://habrahabr.ru/post/187602/, решил провести эксперименты в 1ске
5 Fragster
 
модератор
26.07.13
14:54
(3) Никогда не видел функцию преобразования массива в строку?
6 Fragster
 
модератор
26.07.13
14:54
интересно, сколько молотить будет
7 Maxus43
 
26.07.13
14:56
(6) в одну строку напиши цикл :)
8 H A D G E H O G s
 
26.07.13
14:57
(4) В статье хрень какая-то.
9 Fragster
 
модератор
26.07.13
15:01
(8) и все же 1 значениевструкувнутр, 1 сред, 3 стрзаменить, 1 цел, 1 лог10 и 100000 массив.добавить("ф") минимум в 20 раз быстрее (10 секунд против 0) . сейчас посмотрю на миллионе
10 H A D G E H O G s
 
26.07.13
15:03
(9) Тебе нужен Миллион Ф?

Сделай ее из ОписанияТипа
11 Fragster
 
модератор
26.07.13
15:05
(10) у меня серийные номера с разделителем запятыми записаны на входе и должны быть так записаны на выходе.

а как с описанием типа?
12 zippygrill
 
26.07.13
15:06
еще выполняется цикл?
13 Очкарик
 
26.07.13
15:06
а в миллиард слабо?
14 H A D G E H O G s
 
26.07.13
15:06
Описание=Новый ОписаниеТипов("Строка",,Новый КвалификаторыСтроки(100000000,ДопустимаяДлина.Фиксированная));
    СтрокаФ=Описание.ПривестиЗначение("Ф");
    Сообщить(СтрДлина(СтрокаФ));
15 Очкарик
 
26.07.13
15:07
(14) долго выполняется?
16 vde69
 
модератор
26.07.13
15:08
(11) сразу размер строки задай при создании типа...

у тебя время уходит на выделение и перераспредление памяти.

вообще динамические обьекты более одного сегмента памяти (65к) очень специфически себя ведут, именно для этого во всех языках есть понятие "поток" и работа с потоками а не с обьектом.
17 H A D G E H O G s
 
26.07.13
15:08
(15) Че там выполняться. Идите учите информатику.
18 H A D G E H O G s
 
26.07.13
15:09
Вот, кстати, правильно.

    Описание=Новый ОписаниеТипов("Строка",,Новый КвалификаторыСтроки(100000000,ДопустимаяДлина.Фиксированная));
    СтрокаФ=Описание.ПривестиЗначение("Ф");
    СтрокаФ=СтрЗаменить(СтрокаФ," ","Ф");
    Сообщить(СтрДлина(СтрокаФ));
19 jsmith82
 
26.07.13
15:14
это аналог strdup?
20 Fragster
 
модератор
26.07.13
15:15
(12) выполнился... результат:



Повторений = 1000000;

ТекДата = ТекущаяДата();
Пока ТекДата = ТекущаяДата() Цикл
КонецЦикла;

А = "";
Для Сч = 1 по Повторений Цикл
    А = А + "ф";
КонецЦикла;

Сообщить(ТекущаяДата() - ТекДата - 1);

ТекДата = ТекущаяДата();
Пока ТекДата = ТекущаяДата() Цикл
КонецЦикла;

А = Новый Массив;
Для Сч = 1 по Повторений Цикл
    А.Добавить("ф");
КонецЦикла;
А = СтрЗаменить(СтрЗаменить(СтрЗаменить(Сред(ЗначениеВСтрокуВнутр(А), 54 + Цел(Log10(А.Количество()))), """},
|{""S"",""", ""),"""}
|}
|}",""),"""""","""");

Сообщить(ТекущаяДата() - ТекДата - 1);




способ 1 - 1948 секунд
способ 2 - 8 секунд
21 skunk
 
26.07.13
15:16
1000 - менее секунды
10000 - около 2 секунд
100000 - 10 секунд
22 jsmith82
 
26.07.13
15:16
хм, интересно
какое различие между
стр = стр + "ф"
и стр = стрзаменить(стр, " ", "Ф ");
23 jsmith82
 
26.07.13
15:16
видимо, затраты на аллокацию памяти меньше
какие ещё могут быть причины
24 Fragster
 
модератор
26.07.13
15:17
(14)(16) это замечательно, когда у нас заранее известна длина строки и оно заполнено повторяющимся символом, например в случае с серийниками (в самом запущенном случае - серийники еще и разной длины) это не так
25 H A D G E H O G s
 
26.07.13
15:19
(24) Я тебе в аську написал
26 H A D G E H O G s
 
26.07.13
15:20
Я кстати, непонял, зачем вам строка в 2 мегабайта.
27 Fragster
 
модератор
26.07.13
15:21
(26) это синтетический пример
28 H A D G E H O G s
 
26.07.13
15:23
пишите в файл через ЗаписьТекста, потом прочитайте и будет щасте.
29 Dmitrith
 
26.07.13
15:27
Вам в пятницу заняться больше нечем к концу рабочего дня?
30 Живой Ископаемый
 
26.07.13
15:28
2(29) ты так говоришь, как будто это что-то плохое.
31 Kyon8
 
26.07.13
15:29
Через ЗаписьXML должно быстрее работать.
32 Fragster
 
модератор
26.07.13
15:33
(28) да, так тоже быстрее


ТМП = ПолучитьИмяВременногоФайла();
Ф = Новый ЗаписьТекста(ТМП,,Символы.ПС);

Для Сч = 1 по Повторений Цикл
    Ф.Записать("ф");
КонецЦикла;
Ф.Закрыть();
Ф = Новый ЧтениеТекста(ТМП);
А = Ф.Прочитать();
Ф.Закрыть();
УдалитьФайлы(ТМП);


7 секунд
33 Kyon8
 
26.07.13
15:38
+(31) Провёл эксперимент


Процедура КнопкаВыполнитьНажатие(Кнопка)
    
    Сообщить("Время начала " + ТекущаяДата());
    
    ЗаписьXML = Новый ЗаписьXML;
    ЗаписьXML.УстановитьСтроку();

    Для сч = 1 по 1000000 Цикл
        ЗаписьXML.ЗаписатьБезОбработки("ф");
    КонецЦикла;    
    
    СтрXML = ЗаписьXML.Закрыть();
    
    Сообщить("Время окончания " + ТекущаяДата());
    
КонецПроцедуры


Время начала 26.07.2013 15:39:30
Время окончания 26.07.2013 15:39:35
34 Kyon8
 
26.07.13
15:41
(32) Моё быстрее и файловую систему не трогает )
35 H A D G E H O G s
 
26.07.13
15:42
Вы круты.
36 Fragster
 
модератор
26.07.13
15:43
(34) на моем компе - 7 секунд с файлом и 9 с XML
37 Живой Ископаемый
 
26.07.13
15:43
у меня за одну:

http://screencast.com/t/5Vh7tMZHsX2
38 H A D G E H O G s
 
26.07.13
15:45
СуперМассив=Новый Массив(1000000);
    Для Счетчик=1 По 1000000 Цикл
        СуперМассив[Счетчик-1]="Ф";
    КонецЦикла;
3 секунды
39 Живой Ископаемый
 
26.07.13
15:46
http://screencast.com/t/np8lw7le8
тоже 1 секунда
40 Fragster
 
модератор
26.07.13
15:46
(38) забыл преобразование в строку
41 H A D G E H O G s
 
26.07.13
15:47
(40) Тоесть?
44 Живой Ископаемый
 
26.07.13
15:47
2(41) нужна строка из миллиона символов а не массив с миллионом симоволов
45 Fragster
 
модератор
26.07.13
15:48
(41) у тебя на выходе массив. да, это ускоряет в 2 раза (у меня стабильно 5 секунд) после извращений, которые можно посмотреть в (20)
46 H A D G E H O G s
 
26.07.13
15:49
(45) Ладно, ладно.
47 Fragster
 
модератор
26.07.13
15:50
кстати
А = Новый Массив(Повторений);
Для Сч = 1 по Повторений Цикл
    А[Сч-1] = "ф";
КонецЦикла;

на секунду медленнее

А = Новый Массив(Повторений);
Для Сч = 0 по Повторений-1 Цикл
    А[Сч] = "ф";
КонецЦикла;
48 Kyon8
 
26.07.13
15:51
(36) Запустил в консоли кода с отлкючённой отладкой также как в (37) - в результате и через ЗаписьФайла и через ЗаписьXML по 2 секунды, в прошлый раз похоже отладка мешала.
49 Fragster
 
модератор
26.07.13
15:53
50 zippygrill
 
26.07.13
16:19
(39) что за обработка в скрине? поюзать дашь? :)
51 Fragster
 
модератор
26.07.13
16:23
(50) это инструменты разработчика http://devtool1c.ucoz.ru/
52 zippygrill
 
26.07.13
16:24
(51) бесплатная?
53 Fragster
 
модератор
26.07.13
16:24
(52) lf
54 arsik
 
гуру
26.07.13
16:36
(51) В этой консоли можно временные таблицы посмотреть?
55 Fragster
 
модератор
26.07.13
16:36
(54) дам кучу чего можно, см. сайт
56 arsik
 
гуру
26.07.13
16:54
(55) Я скачал, посмотрел, но не нашел там как временные таблицы запроса посмотреть. Но я смотрел мобильную версию.
57 also
 
26.07.13
17:00
(56) запрос в дерево раскладываешь и смотришь
58 arsik
 
гуру
26.07.13
17:09
(57) Нет там такого - разложить запрос в дерево
59 Живой Ископаемый
 
26.07.13
17:13
Есть
60 wPa
 
26.07.13
17:14
интересным вы тут делом заняты )
61 Fragster
 
модератор
26.07.13
17:15
(60) тут уже почти все, мне теперь интересно по ссылке из (49)
62 KRV
 
26.07.13
17:16
ей богу - кругом пятница.
63 Живой Ископаемый
 
26.07.13
17:22
2(58) нужно говорить: "Я слепой" или "я не нашел",  "я не увидел", а не "Там нету"
http://screencast.com/t/BolJy5cg9kv
64 AlexTim03
 
26.07.13
17:34
Вот так:

а = "ф";
Для Сч = 1 По 20 Цикл
      а = а + а;
КонецЦикла;
а = Лев(а, 1000000);

5мс
У кого скорость быстрее?
65 Fragster
 
модератор
26.07.13
17:35
(64) хотя бы до 1000 итераций увеличь
66 AlexTim03
 
26.07.13
17:36
ЗАчем?

На выходе строка с миллионом значений
67 AlexTim03
 
26.07.13
17:36
*миллионом символов
68 Живой Ископаемый
 
26.07.13
17:36
2(65) зачем?
69 Fragster
 
модератор
26.07.13
17:37
(66) хорошо, замени во всех примерах "Ф" на Строка(Сч).
70 Fragster
 
модератор
26.07.13
17:37
(68) чтобы автор увидел, как 1ска красиво падаетт
71 AlexTim03
 
26.07.13
17:41
(70)Ну да, на 1000 упадет. Но цель же - получить строку, а не положить мгновенно 1С, для этого и есть другие, еще более быстрые способы
72 Fragster
 
модератор
26.07.13
17:43
(71) тогда -> (69)
73 anddro
 
26.07.13
17:51
(72) а вот это уже совсем другая задача. В (0) что требовалось? 1 млн одинаковых символов и максимально быстро. В (64) эта задача решена.
74 Fragster
 
модератор
26.07.13
17:54
(73) задача в (11)