|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
Снижение загрузки ЦП или увеличение скорости программы
Подскажите пожалуйста, я делаю программу, которая рассчитывает все возможные исходы одного процесса.
Процесс зависит от 20-ти переменных, диапазоны значений которых либо известны изначально, либо зависят друг от друга. Таким образом получается 20 вложенных циклов for. Расчет происходит в 4 этапа (6-6-6-2 цикла), после каждого происходит обращение к подпрограмме, в которой только блок условий if-then-else,считающий переменные для следующего этапа. При стандартном наборе переменных программа вычисляет больше миллиарда вариаций, что занимает у нее больше 12 минут. Процесс идет в 2 потока и грузит 33% ЦП, при этом программа виснет и не отвечает в диспетчере задач. Я попытался снизить количество вычислений следующим образом: вычленил некоторые закономерности процесса и, в случае наступления такой закономерности, пропускал последнее обращение к подпрограмме переходя к следующему значению по циклу. Однако время расчета не снизилось даже на секунду, то есть, как я понял, блок, содержащий только условия, ЦП практически не грузит. Есть ли способ как-то еще снять нагрузку, чтобы снизить время хотя бы до 3,5 минут? Некоторые циклы при определенных условиях содержат всего одно значение, если от них как-нибудь избавиться, то это снизит нагрузку? Последний раз редактировалось Dogmat-iGwt, 22.03.2012 в 10:21. |
#2
|
||||
|
||||
Закинь сюда проджект, посмотрим.
Помогаю платно. Помогаю иногда бесплатно. |
#3
|
|||
|
|||
Я б закинул, но он уже сейчас растянулся на 2 с лишним тысячи строк, это к нему как минимум комментарии надо писать...
|
#4
|
||||
|
||||
Без кода можешь обращаться в "Битву экстрасенсов" или программу "Люди Хэ".
Кидай 2000 строк, посмотрю по врмени выполнения. Помогаю платно. Помогаю иногда бесплатно. |
#5
|
||||
|
||||
Цитата:
Я вообще не понял: есть 20 вложенных циклов, а процесс идет в 2х потоках. Это как? |
#6
|
|||
|
|||
Цитата:
Это я кстати тоже не догнал почему в 2 потока, но судя по инфе из диспетчера задач, их 2. Грузят они ровно 33% ЦП. У меня трехядерный атлон. |
#7
|
|||
|
|||
Код в студию. А чтобы программа "не зависала" во время вычислений вставь внутри циклов <Application.ProcessMessages>.
|
Этот пользователь сказал Спасибо icsander за это полезное сообщение: | ||
Dogmat-iGwt (24.03.2012)
|
#8
|
||||
|
||||
Цитата:
Цитата:
И оно точно в 2 потока работает? Т.е. если оно действительно многопоточное, то почему, например, не 10? Цитата:
Цитата:
Посмотри на пакеры exe, теоретически могут и ускорить работу. + Могут помочь опции компиляции. Нет повести печальнее на свете, чем повесть о заклиневшем Resete. Последний раз редактировалось Ferra, 24.03.2012 в 00:39. |
Этот пользователь сказал Спасибо Ferra за это полезное сообщение: | ||
Dogmat-iGwt (24.03.2012)
|
#9
|
||||
|
||||
Цитата:
|
#10
|
||||
|
||||
Цитата:
Но ты путаешь понятия. Например вот посмотри http://www.cyberguru.ru/programming/delphi/threads.html Если твой алгоритм можно распараллелить - то это прилично ускорит скорость работы. И необязательно циклы в разных потоках запускать. Просто выдели части алгоритма которые могут выполняться параллельно. Нет повести печальнее на свете, чем повесть о заклиневшем Resete. Последний раз редактировалось Ferra, 24.03.2012 в 00:55. |
Этот пользователь сказал Спасибо Ferra за это полезное сообщение: | ||
Dogmat-iGwt (24.03.2012)
|
#11
|
|||
|
|||
Ладно, вот приложил чуть-чуть упрощенную версию проги, рассчитывает только количество вариаций=победы+поражения+ничьи. В коде весь ступор в обработчике главной кнопки, остальное все работает нормально.
Как пользоваться: в каждой из 8-ми панелей нужно выбрать по карте, выбор производится проще всего по имени (верхний левый комбобокс на каждой из 8 панелей). Рекомендую прежде чем нажать вычислить выставить в 2-х комбобоксах с надписью 12 в правом-верхнем и правом-нижнем углах окна цифры поменьше. Уже при значении 8 в каждом из них программа считает около минуты. При 12 количество вариаций переваливает за миллиард, прога виснет надолго. Если что, не удивляйтесь некоторым моим решениям, я новичок самоучка, заранее спасибо. Советам, не относящимся к сути вопроса, тоже буду благодарен. |