С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
 Аватар для Dim1One
44 / 44 / 4
Регистрация: 30.04.2011
Сообщений: 283

Очень долгое соединение объемных строк

08.05.2013, 07:44. Показов 1253. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пытаюсь перебрать все возможные варианты соединения строк из пяти Memo. В итоге в строке должно получится 100000 линий:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
void __fastcall TForm1::Button1Click(TObject *Sender)
{
        String OutStr;
        String m1[9], m2[9], m3[9], m4[9], m5[9];
        TStringList *list1 = new TStringList;
        for(int i = 0; i < Memo1->Lines->Count; i++)
        {
                m1[i] = Memo1->Lines->Strings[i];
                m2[i] = Memo2->Lines->Strings[i];
                m3[i] = Memo3->Lines->Strings[i];
                m4[i] = Memo4->Lines->Strings[i];
                m5[i] = Memo5->Lines->Strings[i];
        }
 
        for(int j1 = 0; j1 < Memo1->Lines->Count; j1++)
        {
            for(int j2 = 0; j2 < Memo1->Lines->Count; j2++)
            {
                for(int j3 = 0; j3 < Memo1->Lines->Count; j3++)
                {
                    for(int j4 = 0; j4 < Memo1->Lines->Count; j4++)
                    {
                        for(int j5 = 0; j5 < Memo1->Lines->Count; j5++)
                        {
                                OutStr += m1[j1] + " " + m2[j2] + " " + m3[j3] + " " + m4[j4] + " " + m5[j5] + "\n";
                             //   ShowMessage(OutStr);
 
                        }
                    }
                }
            }
        }
        list1->Add(OutStr);
        list1->SaveToFile("C:\\log.txt");
        delete list1;
}
При нажатии на кнопку программа ест 50% процессора и я так и не могу дождаться выполнения кода до конца. Видимо, строки слишком долго соединяются.
На VB.NET делал тоже самое, только OutStr была типа StringBuilder и строки соединял так:
VB.NET
1
OutStr.AppendLine(m1(j1) & " " & m2(j2) & " " & m3(j3) & " " & m4(j4) & " " & m5(j5) & vbCrLf)
Выполнялось все за считанные секунды.
Как быть в С++?
Миниатюры
Очень долгое соединение объемных строк  
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.05.2013, 07:44
Ответы с готовыми решениями:

Очень долгое освобождение динамически выделенной памяти
Все никак не могу разобраться с одной проблеммой! У меня есть отображение, в котором хранятся указатели на абстрактный класс Node ...

Очень долгое выключение ПК
Здравствуйте, уважаемые форумчане. Пользовался поиском но ответ на свою проблему не нашел. Вообщем вчера установил Widows 8.1. Все...

Очень долгое сохранение файла
Всем привет. Работаю в программе Mathcad 15 M020, возникла проблема при сохранении файл программа очень долго сохраняет,не работает...

16
1408 / 572 / 127
Регистрация: 31.10.2011
Сообщений: 1,960
08.05.2013, 09:30
C++
1
String OutStr = Memo1->Text+Memo2->Text+Memo3->Text+Memo4->Text+Memo5->Text;
0
 Аватар для Dim1One
44 / 44 / 4
Регистрация: 30.04.2011
Сообщений: 283
08.05.2013, 11:01  [ТС]
_Dimon_, Это не то. Прочитайте внимательнее суть проблемы.
0
 Аватар для Lelik-pahan
1703 / 899 / 207
Регистрация: 25.11.2009
Сообщений: 1,848
08.05.2013, 11:27
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
void __fastcall TForm1::Button2Click(TObject *Sender)
{
    TStringList *list1 = new TStringList;
    TStringList *list2 = new TStringList;
    TStringList *list3 = new TStringList;
    TStringList *list4 = new TStringList;
    TStringList *list5 = new TStringList;
    TStringList *list6 = new TStringList;
 
    list1->AddStrings(Memo1->Lines);
    list2->AddStrings(Memo2->Lines);
    list3->AddStrings(Memo3->Lines);
    list4->AddStrings(Memo4->Lines);
    list5->AddStrings(Memo5->Lines);
 
 
    for(int j1 = 0; j1 < 10; j1++)
        for(int j2 = 0; j2 < 10; j2++)
            for(int j3 = 0; j3 < 10; j3++)
                for(int j4 = 0; j4 < 10; j4++)
                    for(int j5 = 0; j5 < 10; j5++)
                        list6->Add(list1->Strings[j1] + " " + list2->Strings[j2] + " " + list3->Strings[j3] + " " + list4->Strings[j4] + " " + list5->Strings[j5]);
 
    list6->SaveToFile("C:\\log.txt");;
 
    delete list1;
    delete list2;
    delete list3;
    delete list4;
    delete list5;
    delete list6;
}
Главное заменить OutStr на стринглист. Тормоза были из-за
C++
1
OutStr += ...
Кстати, ты писал, что
Цитата Сообщение от Dim1One Посмотреть сообщение
должно получится 100000 линий
Так получится, если в каждом мемо по 10 строк. А массивы ты объявлял размером 9
1
 Аватар для Dim1One
44 / 44 / 4
Регистрация: 30.04.2011
Сообщений: 283
08.05.2013, 11:41  [ТС]
Lelik-pahan, спасибо, со стринглистами работает. Странно, на VB.NET это делается в разы быстрее, чем на С++. VB.NET - ~0.5сек, С++ - ~3сек. Я думал, что С++ по быстродействию превосходит VB.NET. Походу, это не так.
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
08.05.2013, 18:26
Цитата Сообщение от Dim1One Посмотреть сообщение
Lelik-pahan, спасибо, со стринглистами работает. Странно, на VB.NET это делается в разы быстрее, чем на С++. VB.NET - ~0.5сек, С++ - ~3сек. Я думал, что С++ по быстродействию превосходит VB.NET. Походу, это не так.
Походу с кривыми руками не только к таким вывода придёш...
0
08.05.2013, 20:18  [ТС]

Не по теме:

Avazart, лучше бы по теме чего-нибудь написали, а не показывали "крутость".

0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
08.05.2013, 20:54
А что по теме ?
VCL не есть С++ это библиотека из Delphi

Добавлено через 7 минут
Что касается сохранение в файл то С++ способы тоже не особо быстые ( а TStringList то вообще ) тут лучше использовать вывод в стиле Си
0
2625 / 1636 / 266
Регистрация: 19.02.2010
Сообщений: 4,348
08.05.2013, 22:01
Блин, когда народ научится выносить инварианты из циклов?

Каждое получение Memo1->Lines->Count - это 2 вызова гет-функции.
Каждый +" " - это вызов конструктора и деструктора AnsiString (и такое парное щастье будет аж 4 раза за итерацию цикла).

В общем, тормоза возникают не только при копировании-объединении строк. Они там по всей программе вдоль и поперёк.
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
08.05.2013, 22:12
C++
1
2
3
4
5
6
7
8
9
    TStringList *list1 = new TStringList;
    TStringList *list2 = new TStringList;
    TStringList *list3 = new TStringList;
    TStringList *list4 = new TStringList;
    TStringList *list5 = new TStringList;
    TStringList *list6 = new TStringList;
 
    list1->AddStrings(Memo1->Lines);
    //....
Это тоже по сути не дешево ... тут нужен разве что list6 как результат

Добавлено через 4 минуты
Цитата Сообщение от VTsaregorodtsev Посмотреть сообщение
Каждый +" " - это вызов конструктора и деструктора AnsiString (и такое парное щастье будет аж 4 раза за итерацию цикла).
Ну тут непонятно о каких строках кода вы говорите..
0
2625 / 1636 / 266
Регистрация: 19.02.2010
Сообщений: 4,348
08.05.2013, 23:04
Avazart, 25 в первом и 22 в 4 постах темы
0
 Аватар для Lelik-pahan
1703 / 899 / 207
Регистрация: 25.11.2009
Сообщений: 1,848
08.05.2013, 23:06
Avazart, тут стринглисты ввёл, чтобы в циклах не было обращения к мемо, это явно было бы медленнее. А основная задержка была из-за OutStr +=..., которое вызывалось 105 раз и с каждым разом выполнялось всё медленнее, т. к. происходило чтние и потом полная перезапись всего содержимого переменной.
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
08.05.2013, 23:08
Цитата Сообщение от Lelik-pahan Посмотреть сообщение
Avazart, тут стринглисты ввёл, чтобы в циклах не было обращения к мемо, это явно было бы медленнее.
Из-за чего чего это медленее в Мемо по сути тот же StringList сидит?
А копировать то что уже есть не медленнее ?

Цитата Сообщение от VTsaregorodtsev Посмотреть сообщение
Avazart, 25 в первом и 22 в 4 постах темы
Ну не вижу там причин вызывающих лишние конструкторы ...
0
 Аватар для Lelik-pahan
1703 / 899 / 207
Регистрация: 25.11.2009
Сообщений: 1,848
08.05.2013, 23:12
Цитата Сообщение от VTsaregorodtsev Посмотреть сообщение
Каждый +" " - это вызов конструктора и деструктора AnsiString
Цитата Сообщение от VTsaregorodtsev Посмотреть сообщение
25 в первом и 22 в 4 постах темы
в первом случае никакого конструктора не вызывается, там просто происходит перезапись значения. А деструктор не вызывается ни в одном случае.

Да и не думаю, что конструктор ансистринга очень громоздкий...

Добавлено через 3 минуты
Цитата Сообщение от Avazart Посмотреть сообщение
Из-за чего чего это медленнее в Мемо по сути тот же StringList сидит?
может был не прав, но посчитал, что обращение к визуальным компонентом имеет свои накладные расходы.
Цитата Сообщение от Avazart Посмотреть сообщение
А копировать то что уже есть не медленнее ?
Исходя из вышеупомянутой теории накладных расходов при обращении к мемо, гораздо выгоднее произвести копирование 5 раз и не обращаться к мемо в цикле 100 000 раз...

Возможно, это было лишним, но потери времени здесь совершенно ничтожны, по сравнению с тем, что было при OutStr +=. И я ведь написал
Цитата Сообщение от Lelik-pahan Посмотреть сообщение
Главное заменить OutStr на стринглист
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
08.05.2013, 23:14
Цитата Сообщение от Lelik-pahan Посмотреть сообщение
может был не прав, но посчитал, что обращение к визуальным компонентом имеет свои накладные расходы.
Мы только читаем от туда строки... другое дело если бы что-то туда вставляли тем самым вызывали перерисовку - это бы действительно бы тормазило, а так лишние и затратные действия.
0
 Аватар для Lelik-pahan
1703 / 899 / 207
Регистрация: 25.11.2009
Сообщений: 1,848
08.05.2013, 23:18
Цитата Сообщение от Avazart Посмотреть сообщение
Мы только читаем от туда строки... другое дело если бы что-то туда вставляли тем самым вызывали перерисовку - это бы действительно бы тормазило ..
Avazart, не спорю. Но делал второпях. Последовательно вносил изменения в код в поисках тормозов. Заменил мемо на стринглисты. Потом заменил одну строковую переменную на стринглист, получил результат и сразу написал свой код в ответ.
0
2625 / 1636 / 266
Регистрация: 19.02.2010
Сообщений: 4,348
12.05.2013, 16:21
Цитата Сообщение от Avazart Посмотреть сообщение
Ну не вижу там причин вызывающих лишние конструкторы ...
Ну, в свежих Билдерах может и появился у АнсиСтринга метод operator +(const char*) - но у Билдера6 его не было. Был только operator +(const AnsiString&). Как предлагаете в таком случае прибавлять char-строку без вызовов для неё конструктора-деструктора объекта?
В общем, пусть ТС поглядит на эту строку в окне CPU-команд и точно скажет - что в его конкретной версии Билдера происходит.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.05.2013, 16:21
Помогаю со студенческими работами здесь

ОЧЕНЬ долгое выполнение запроса
Очень долгое выполнение запроса, в каждой таблице (кроме regions), примерно 60 000 строк. Такой запрос, который выбирает все товары у...

очень долгое выключение компьютера
Подскажите из=за чего компьютер стал долго выключаться(более минуты)????Как найти процесс который мешает завершеию работы? Добавлено...

LSB очень долгое считывание пикселей
реализую метод стеганографии LSB в изображении использую только по одному биту в каждой из цветовых компонент пикселя (RGB) за основу...

Очень долгое включение блока питания.
Всем привет! Столкнулся с проблемой в работе импульсного блока питания 220в -&gt; 12в/30а на микросхеме tl494cn...

Очень долгое копирование информации с USB-флешкой.
Суть такова: У меня комп старенький (куплен 2.5 года назад), я купил флэшку, когда я копирую на нее информацию у знакомого (у него комп...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru