![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
![]() Доброго времени суток, форумчане!
Не обессудьте, что первое мое сообщение на форуме начинается в разделе: "помогай-выручай". Но ближе к делу. Есть цикл for в цикле for. А - количество слов в полученной строке. В - количество букв в каждом слове. (вычисление А и В можно упустить) Код:
for A downto 1 do for B downto 1 do begin //тут много нудных, запутанных и трудоемких операций с элементами строки. Анализ каждой буквы и слова целиком. Подключение к БД... //А результат страданий цикла записывается в ячейку одномерного массива mas[A] end; Нижний цикл очень затратный по времени, а выполниться он должен А раз. Смотря на программу, которая скачивает файлы потоками, возникла идея создания подобного. То есть, чтобы одновременно выполнялось А количество нижних циклов, а не последовательно. Собственно вопросы: Возможно ли это реализовать? Если да, тогда будет ли это быстрее чем последовательно? Если да, тогда с помощью чего это реализовать? Наверняка, где-то в гугле это есть, но я даже не знаю, что искать. Посоветуйте мне статей по данной теме. А так же, если не лень, напишите примеры и объясните их. ПС: Я не отношусь к тому типу людей, которые лепят в код все подряд без разбору, лишь бы работало. Я хочу разобраться в каждой букве ![]() |
#2
|
|||
|
|||
![]() Это возможно только если у тебя хотябы внутри внешнего цикла нет зависимостей одной итерации от другой. Тогда каждую внешнюю итерацию можно "выбросить" в отдельный поток. Только несколько замечаний:
1. Подключение к БД (в твоих комментариях есть) надо сделать вне циклов/потоков. Т.е. подключение к БД должно быть строго одно. 2. Обращение к БД лучше всего синхронизировть между потоками, что бы с БД в один момент работал только один поток. Это желательно, хотя, возможно, и не требуется. 3. Кол-во потоков лучше ограничить каким-нибудь разумным числом, например 10 (не любит Винда очень много потоков. Для этого надо сделать очередь заданий и пул потоков. Каждый поток берет из очереди задание и обрабатывает его (код получения задания - в CriticalSection). Если заданий нет (очередь пуста), то поток завершается. Основной поток тем временем ждет, пока не будут завершены все потоки. Как-то так. |
#3
|
||||
|
||||
![]() Цитата:
Лучше: 1 поток - 1 подключение Некоторые программисты настолько ленивы, что сразу пишут рабочий код. Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты. |
#4
|
||||
|
||||
![]() http://www.cyberguru.ru/delphi/threads.html
Тут говорят о том, что потоки создают только мнительную параллельность выполнения процессов. На самом же деле, как говорит автор этой статьи, процессор не может обрабатывать несколько участков кода одновременно. В вопросе оптимизации использование параллельных потоков возможно только для многоядерного процессора. Выходит, что если я создам 4 потока, то процессор с двумя ядрами параллельно сможет выполнять только 2? А так же возник вопрос, а нужно ли указывать где-то, что потоки должны выполняться на разных ядрах или виндовс сам поймет? И вот еще если нужно указывать, тогда если это запустить на одно-ядерном процессоре, тогда скорее всего он выведет в ошибку. Я все правильно понял? |
#5
|
||||
|
||||
![]() Цитата:
Но если речь идет исключительно о вычислениях, без ввода-вывода, то это так. Цитата:
Цитата:
Потоку выделяется квант времени (например, 10 мс). По истечении этого времени если есть другие готовые к выполнению потоки, то текущий вырубается и на его место ставится другой. То же самое касается и процессов в Windows (потоки лучше только тем, что при их переключении требуется меньше ресурсов). Цитата:
jmp $ ; Happy End! The Cake Is A Lie. Последний раз редактировалось Bargest, 24.11.2012 в 17:39. |
#6
|
||||
|
||||
![]() Цитата:
Цитата:
Так же если сервер с базой данных многоядерный, то твое приложение работающее на компьютере с одним ядром будет работать быстрее если делать запросы к базе в два потока, чем в один. И тоже не нужно забывать о пользовательском интерфейсе: если запросы к базе будут идти в главном потоке, то приложение в это время будет подвисшим, что опять же приведёт к замедлению работы пользователя с приложением. Цитата:
![]() Цитата:
![]() |
#7
|
||||
|
||||
![]() Всем спасибо за помощь, разобрался, начну переходить в практике. Если возникнут вопросы, тему буду продолжать
![]() |