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

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

08.05.2013, 07:44. Показов 1266. Ответов 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
1707 / 903 / 207
Регистрация: 25.11.2009
Сообщений: 1,850
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
8488 / 6155 / 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
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
08.05.2013, 20:54
А что по теме ?
VCL не есть С++ это библиотека из Delphi

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

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

В общем, тормоза возникают не только при копировании-объединении строк. Они там по всей программе вдоль и поперёк.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 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
2738 / 1663 / 267
Регистрация: 19.02.2010
Сообщений: 4,396
08.05.2013, 23:04
Avazart, 25 в первом и 22 в 4 постах темы
0
 Аватар для Lelik-pahan
1707 / 903 / 207
Регистрация: 25.11.2009
Сообщений: 1,850
08.05.2013, 23:06
Avazart, тут стринглисты ввёл, чтобы в циклах не было обращения к мемо, это явно было бы медленнее. А основная задержка была из-за OutStr +=..., которое вызывалось 105 раз и с каждым разом выполнялось всё медленнее, т. к. происходило чтние и потом полная перезапись всего содержимого переменной.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
08.05.2013, 23:08
Цитата Сообщение от Lelik-pahan Посмотреть сообщение
Avazart, тут стринглисты ввёл, чтобы в циклах не было обращения к мемо, это явно было бы медленнее.
Из-за чего чего это медленее в Мемо по сути тот же StringList сидит?
А копировать то что уже есть не медленнее ?

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

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

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

Возможно, это было лишним, но потери времени здесь совершенно ничтожны, по сравнению с тем, что было при OutStr +=. И я ведь написал
Цитата Сообщение от Lelik-pahan Посмотреть сообщение
Главное заменить OutStr на стринглист
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
08.05.2013, 23:14
Цитата Сообщение от Lelik-pahan Посмотреть сообщение
может был не прав, но посчитал, что обращение к визуальным компонентом имеет свои накладные расходы.
Мы только читаем от туда строки... другое дело если бы что-то туда вставляли тем самым вызывали перерисовку - это бы действительно бы тормазило, а так лишние и затратные действия.
0
 Аватар для Lelik-pahan
1707 / 903 / 207
Регистрация: 25.11.2009
Сообщений: 1,850
08.05.2013, 23:18
Цитата Сообщение от Avazart Посмотреть сообщение
Мы только читаем от туда строки... другое дело если бы что-то туда вставляли тем самым вызывали перерисовку - это бы действительно бы тормазило ..
Avazart, не спорю. Но делал второпях. Последовательно вносил изменения в код в поисках тормозов. Заменил мемо на стринглисты. Потом заменил одну строковую переменную на стринглист, получил результат и сразу написал свой код в ответ.
0
2738 / 1663 / 267
Регистрация: 19.02.2010
Сообщений: 4,396
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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru