Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 24.11.2012, 05:06
Аватар для MarlboroRed
MarlboroRed MarlboroRed вне форума
Прохожий
 
Регистрация: 24.11.2012
Сообщения: 6
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Оптимизация кода (скорость выполнения)

Доброго времени суток, форумчане!

Не обессудьте, что первое мое сообщение на форуме начинается в разделе: "помогай-выручай". Но ближе к делу.

Есть цикл for в цикле for.

А - количество слов в полученной строке.
В - количество букв в каждом слове.

(вычисление А и В можно упустить)

Код:
for A downto 1 do
  for B downto 1 do
    begin
       //тут много нудных, запутанных и трудоемких операций с элементами строки. Анализ каждой буквы и слова целиком. Подключение к БД...

       //А результат страданий цикла записывается в ячейку одномерного массива mas[A]

    end;

Нижний цикл очень затратный по времени, а выполниться он должен А раз. Смотря на программу, которая скачивает файлы потоками, возникла идея создания подобного. То есть, чтобы одновременно выполнялось А количество нижних циклов, а не последовательно. Собственно вопросы:

Возможно ли это реализовать? Если да, тогда будет ли это быстрее чем последовательно? Если да, тогда с помощью чего это реализовать?

Наверняка, где-то в гугле это есть, но я даже не знаю, что искать. Посоветуйте мне статей по данной теме. А так же, если не лень, напишите примеры и объясните их.

ПС: Я не отношусь к тому типу людей, которые лепят в код все подряд без разбору, лишь бы работало. Я хочу разобраться в каждой букве
Ответить с цитированием
  #2  
Старый 24.11.2012, 09:07
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,087
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Это возможно только если у тебя хотябы внутри внешнего цикла нет зависимостей одной итерации от другой. Тогда каждую внешнюю итерацию можно "выбросить" в отдельный поток. Только несколько замечаний:
1. Подключение к БД (в твоих комментариях есть) надо сделать вне циклов/потоков. Т.е. подключение к БД должно быть строго одно.
2. Обращение к БД лучше всего синхронизировть между потоками, что бы с БД в один момент работал только один поток. Это желательно, хотя, возможно, и не требуется.
3. Кол-во потоков лучше ограничить каким-нибудь разумным числом, например 10 (не любит Винда очень много потоков. Для этого надо сделать очередь заданий и пул потоков. Каждый поток берет из очереди задание и обрабатывает его (код получения задания - в CriticalSection). Если заданий нет (очередь пуста), то поток завершается. Основной поток тем временем ждет, пока не будут завершены все потоки.
Как-то так.
Ответить с цитированием
  #3  
Старый 24.11.2012, 14:46
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,907
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Цитата:
Сообщение от lmikle
2. Обращение к БД лучше всего синхронизировть между потоками, что бы с БД в один момент работал только один поток. Это желательно, хотя, возможно, и не требуется.

Лучше: 1 поток - 1 подключение
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #4  
Старый 24.11.2012, 17:02
Аватар для MarlboroRed
MarlboroRed MarlboroRed вне форума
Прохожий
 
Регистрация: 24.11.2012
Сообщения: 6
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

http://www.cyberguru.ru/delphi/threads.html

Тут говорят о том, что потоки создают только мнительную параллельность выполнения процессов. На самом же деле, как говорит автор этой статьи, процессор не может обрабатывать несколько участков кода одновременно. В вопросе оптимизации использование параллельных потоков возможно только для многоядерного процессора.

Выходит, что если я создам 4 потока, то процессор с двумя ядрами параллельно сможет выполнять только 2? А так же возник вопрос, а нужно ли указывать где-то, что потоки должны выполняться на разных ядрах или виндовс сам поймет? И вот еще если нужно указывать, тогда если это запустить на одно-ядерном процессоре, тогда скорее всего он выведет в ошибку.

Я все правильно понял?
Ответить с цитированием
  #5  
Старый 24.11.2012, 17:25
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Цитата:
В вопросе оптимизации использование параллельных потоков возможно только для многоядерного процессора.
Примерно так. Примерно потому, что если есть обращение к внешним ресурсам (файлам, БД, сети), то поток на время ожидания этого ресурса убирается из планирования. Поэтому пока один будет ждать чтения из файла или из БД, он может перестать выполняться, и дать время другому потоку. А когда дело касается сети, поток может вообще "повеситься" на несколько секунд или даже десятков секунд, пока придут данные. В многопоточной системе это время висения могут занять полезные вычисления.
Но если речь идет исключительно о вычислениях, без ввода-вывода, то это так.
Цитата:
Выходит, что если я создам 4 потока, то процессор с двумя ядрами параллельно сможет выполнять только 2?
Да.
Цитата:
А так же возник вопрос, а нужно ли указывать где-то, что потоки должны выполняться на разных ядрах или виндовс сам поймет?
Поток - понятие ОС. Если в очереди потоков есть те, которые готовы к выполнению (не спят и не ожидают событий), то она их запускает, пока есть свободные камни.
Потоку выделяется квант времени (например, 10 мс). По истечении этого времени если есть другие готовые к выполнению потоки, то текущий вырубается и на его место ставится другой. То же самое касается и процессов в Windows (потоки лучше только тем, что при их переключении требуется меньше ресурсов).
Цитата:
И вот еще если нужно указывать, тогда если это запустить на одно-ядерном процессоре, тогда скорее всего он выведет в ошибку.
Ничего он не выведет. В винде на одноядерном процессоре преспокойно работают в псевдопараллельном режиме ~80 процессов. В каждом по несколько потоков. Винда сама разберется с переключением.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось Bargest, 24.11.2012 в 17:39.
Ответить с цитированием
  #6  
Старый 24.11.2012, 17:28
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от MarlboroRed
http://www.cyberguru.ru/delphi/threads.html

Тут говорят о том, что потоки создают только мнительную параллельность выполнения процессов. На самом же деле, как говорит автор этой статьи, процессор не может обрабатывать несколько участков кода одновременно.
Совершенно верно.
Цитата:
Сообщение от MarlboroRed
В вопросе оптимизации использование параллельных потоков возможно только для многоядерного процессора.
Глупости пишет. Представь себе что набирая текст в Word-е он бы при нажатии каждой буквы останавливал бы тебя чтобы найти набранное слово в своих орфографических словарях. А так ты текст набираешь, а Word тихонько в отдельном потоке со словарями сверяется.
Так же если сервер с базой данных многоядерный, то твое приложение работающее на компьютере с одним ядром будет работать быстрее если делать запросы к базе в два потока, чем в один. И тоже не нужно забывать о пользовательском интерфейсе: если запросы к базе будут идти в главном потоке, то приложение в это время будет подвисшим, что опять же приведёт к замедлению работы пользователя с приложением.
Цитата:
Сообщение от MarlboroRed
Выходит, что если я создам 4 потока, то процессор с двумя ядрами параллельно сможет выполнять только 2?
Естественно
Цитата:
Сообщение от MarlboroRed
А так же возник вопрос, а нужно ли указывать где-то, что потоки должны выполняться на разных ядрах или виндовс сам поймет?
Указывать не нужно "виндовс сам поймет"
Ответить с цитированием
  #7  
Старый 25.11.2012, 21:03
Аватар для MarlboroRed
MarlboroRed MarlboroRed вне форума
Прохожий
 
Регистрация: 24.11.2012
Сообщения: 6
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Всем спасибо за помощь, разобрался, начну переходить в практике. Если возникнут вопросы, тему буду продолжать
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 05:35.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025