Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
12 / 12 / 9
Регистрация: 12.04.2012
Сообщений: 259

Ускорить алгоритм

29.06.2014, 00:59. Показов 2496. Ответов 29
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть код который сохраняет строку из StringList в 2-ой StringList, если этой строки нет в 3-ий StringList ...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
unsigned __stdcall OST( void* Param )
{
std::auto_ptr<TStringList> SaveOst(new TStringList);
AnsiString ls=lst2->Text;
AnsiString a1="";
for (int i = 0; i < lst->Count; i++) {
count++;
 a1=lst->Strings[i];
   if(ls.Pos(a1)==0) SaveOst->Add(lst->Strings[i]);
 
}
 
SaveOst->SaveToFile("Ostatok.txt");
_endthreadex(0);
 return 0;
}
Работает не достаточно быстро, как можно эффективно изменить алгоритм для ускорения программы...
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
29.06.2014, 00:59
Ответы с готовыми решениями:

Ускорить алгоритм обработки текста
Здравствуйте. Есть программа для обработки ссылок на сайты - нахождение и сохранение доменов. Её работа заключается в следующем: есть...

Ускорить объединение двух стринггридов (алгоритм)
Привет всем. постараюсь объяснить суть вопроса. на сервере есть исполняемая программа типа база (список , координаты, и другие метки)...

Ускорить алгоритм удаления одного списка из другого
Здравствуйте. Есть два списка : один на 181093 строк другой на 80000. Нужно удалить один список из другого. Моя реализация: ...

29
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
01.07.2014, 01:39
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от leva Посмотреть сообщение
и я понимаю что это не самый лучший вариант...
На несколько порядков не лучший, но хозяин - барин... Заменить пять буковок кода - это, конечно же, излишние заморочки. ))
Кстати, о сортировке изначально не было сказано ни слова.
0
 Аватар для kzru_hunter
1124 / 795 / 101
Регистрация: 01.02.2011
Сообщений: 1,887
Записей в блоге: 1
02.07.2014, 17:00
Цитата Сообщение от BRcr Посмотреть сообщение
vector < int > v1( size ), v2( size ), v3( size ), v4( size );
Заметил ошибку.

Нужно так:
Цитата Сообщение от BRcr Посмотреть сообщение
vector < int > v1( size ), v2( size ), v3, v4;
У меня так std::inserter на 0.1-0.5 мс быстрее отрабатывает
0
45 / 48 / 5
Регистрация: 24.06.2013
Сообщений: 677
03.07.2014, 01:34
Что серьёзно? Никого кроме меня не смущает
Цитата Сообщение от leva Посмотреть сообщение
SaveOst->SaveToFile("Ostatok.txt");
?
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
03.07.2014, 15:00
Цитата Сообщение от kzru_hunter Посмотреть сообщение
Заметил ошибку.
Все верно, моя ошибка.
Погонял на разных диапазонах - back_inserter у меня отрабатывает в среднем на 5 - 10 % быстрее.

Добавлено через 3 минуты
Retyrn0, сохранение происходит один раз по завершении выборки. Сохраняется стандартным методом класса TStringList. Так что нет - никого кроме тебя это не смущает.

Если есть желание сравнить скорости записи в файл различными способами - милости просим.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
03.07.2014, 15:10
Цитата Сообщение от BRcr Посмотреть сообщение
Погонял на разных диапазонах - back_inserter у меня отрабатывает в среднем на 5 - 10 % быстрее.
Ну оценивать в % не корректно, ибо разница будет тем больше чем больше элементов вставляться.
Кроме того логично было бы делать reserve() что бы исключить перераспределение памяти.
0
45 / 48 / 5
Регистрация: 24.06.2013
Сообщений: 677
03.07.2014, 15:11
Цитата Сообщение от BRcr Посмотреть сообщение
сохранение происходит один раз по завершении выборки
Ну я не видел весь код, а ты? Если предположить что функция вызывается внутри другого цикла...мне трудно представить такой длинный список, чтобы ТС не хватало скорости...
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
03.07.2014, 15:23
Ну логичнее было сохранять с помощью fstream,
тогда можно было бы с экономить время на излишнем преобразование std::vector<String> -> TStringList
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
03.07.2014, 15:51
Цитата Сообщение от Retyrn0 Посмотреть сообщение
Если предположить что функция вызывается внутри другого цикла...мне трудно представить такой длинный список, чтобы ТС не хватало скорости...
Зачем такое предполагать? На это нет оснований. Спроси у ТС - и всех делов.
А насчет длины списка и скорости - у ТС может быть малопроизводительная система либо очень большие объемы текста. В обоих случаях даже самый оптимизированный алгоритм может работать относительно долго.

Добавлено через 3 минуты
Avazart, провел тесты. Опять смешные результаты.
При увеличении количества элементов в векторах разница скорости уменьшается. При этом использование reserve никаких заметных изменений в картину не вносит. Парадокс какой-то...
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
03.07.2014, 19:37
http://microfork.com/stdvector... -analisys/

Пример для понимания разницы

Код
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include <iostream>
#include <vector>
#include <string>
 
#include <iostream>
#include <vector>
#include <string>
 
class test
{
    public:
        test(const int n):n_(n)
        {
            std::cout<<"constructor "<<n_<<std::endl;
        };
 
        test(const test& some)
        {
           std::cout<<"copy constructor "<<some.n_<<std::endl;
           n_= some.n_;
        }
 
        test& operator=(const test& some)
        {
            std::cout<<"assign "<<n_<<"="<<some.n_<<std::endl;
            n_= some.n_;
            return *this;
        }
 
        ~test()
        {
            std::cout<<"destructor "<<n_<<std::endl;
        };
 
    private:
        int n_;
};
 
int main()
{
    std::vector<test> vtest1;
    std::vector<test> vtest2;
 
    const size_t size= 4;
    vtest1.reserve(size);
    vtest2.reserve(size);
 
    std::cout<<std::endl<<"insert():"<<std::endl;
    for(size_t i=0; i<size; ++i)
    {
        std::cout<<i<<")"<<std::endl;
        vtest1.insert(vtest1.begin(),test(i));
    }
 
    std::cout<<std::endl<<"push_back():"<<std::endl;
    for(size_t i=0; i<size; ++i)
    {
        std::cout<<i<<")"<<std::endl;
        vtest2.push_back(test(i));
    }
 
    getchar();
    return 0;
}


Вывод для МSVС2010
insert():
0)
constructor 0
copy constructor 0
destructor 0
1)
constructor 1
copy constructor 1
copy constructor 1
assign 1=0
assign 0=1
destructor 1
destructor 1
2)
constructor 2
copy constructor 2
copy constructor 0
assign 0=1
assign 1=0
destructor 0
copy constructor 0
assign 0=2
assign 2=0
destructor 0
destructor 2
3)
constructor 3
copy constructor 3
copy constructor 1
assign 1=2
assign 2=1
destructor 1
copy constructor 1
assign 1=3
assign 3=1
destructor 1
copy constructor 1
assign 1=0
assign 0=1
destructor 1
destructor 3

push_back():
0)
constructor 0
copy constructor 0
destructor 0
1)
constructor 1
copy constructor 1
destructor 1
2)
constructor 2
copy constructor 2
destructor 2
3)
constructor 3
copy constructor 3
destructor 3


Вывод для С++BuilderXE3 (x86)
insert():
0)
constructor 0
copy constructor 0
copy constructor 0
destructor 0
destructor 0
1)
constructor 1
copy constructor 1
copy constructor 0
assign 0=1
destructor 1
destructor 1
2)
constructor 2
copy constructor 2
copy constructor 0
assign 0=1
assign 1=2
destructor 2
destructor 2
3)
constructor 3
copy constructor 3
copy constructor 0
assign 0=1
assign 1=2
assign 2=3
destructor 3
destructor 3

push_back():
0)
constructor 0
copy constructor 0
destructor 0
1)
constructor 1
copy constructor 1
destructor 1
2)
constructor 2
copy constructor 2
destructor 2
3)
constructor 3
copy constructor 3
destructor 3


Онлайн компилятор http://codepad.org/qp9FP2b1

Чет с XE3 непонятки, как обычно...
1
03.07.2014, 21:09

Не по теме:

Цитата Сообщение от BRcr Посмотреть сообщение
На это нет оснований
Нет оснований утверждать обратное.
Цитата Сообщение от BRcr Посмотреть сообщение
Спроси у ТС - и всех делов
Вот тут согласен.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.07.2014, 21:09
Помогаю со студенческими работами здесь

Ускорить алгоритм составления списка файлов данной директории
Здравствуйте. Есть папка с файлами(462166 штук), как мне быстро получить их список, а следовательно и их количество? Вот, собственно,...

Ускорить программу
моя программа очень долго заносит данные из файла в мемо1 я так думаю это из-за того что считывание идет по циклу я знаю что можно щитати...

Ускорить вывод в RichEdit
Я генерирую миллион значений Все значения вывожу в поток: osftream p(&quot;text.txt&quot;); for(i=0; i &lt; 1000000; i++) { p &lt;&lt;...

Алгоритм шифрования DES (необходимо ускорить любым доступным способом)
Есть алгоритм шифрования дес, он работает но работает медленно ну или скажем так ... недостаточно быстро для того чтобы препод его принял....

Волновой алгоритм поиска (Алгоритм A* / Алгоритм А стар)
Хочу разработать алгоритм для решения головоломки с подвижными дисками (перестановочная головоломка). Определение. Перестано́вочные...


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

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru