Я пытался закодировать 6-7 вложенных циклов for с помощью Vb.net и попытался скомпилировать его на компьютере i9-9900 с 32 ГБ памяти, но время выполнения занимает слишком много времени! Я запустил диспетчер задач и понял, что приложение использует только 10% процессора и меньше 20 мб памяти! так есть ли способ ускорить цикл for, используя больше мощности процессора?
вот пример того, что я кодировал:
Dim maxNo As Integer
maxNo = 200
For i = 0 To maxNo
For k = i To maxNo
For j = k To maxNo
For l = j To maxNo
For m = l To maxNo
For n = m To maxNo
For q = n To maxNo
'......
Next q
Next n
Next m
Next l
Next j
Next k
Next i
Заранее спасибо, Программист
попробовал код на высокой спецификации. компьютер, но для завершения циклов по-прежнему требуется слишком много времени. Я хочу воспользоваться мощным ПК, чтобы быстрее запускать код.
Ваш расчет имеет порядок N ^ 7, поэтому он будет быстро увеличиваться с увеличением N. Это примерно порядок высокоточных симуляций квантовой механики, так что, возможно, есть несколько примеров из этой области способов справиться с этим, но в основном я думают, что их стратегии включают огромные вычислительные ресурсы и ограниченное N (или переход к другим алгоритмам более низкого порядка, чем N^7).
Если вы можете сделать что-нибудь, чтобы убрать циклы, я настоятельно рекомендую вам это сделать.
Если вы считаете, что ваше текущее дело имеет управляемое значение N и должно лучше соответствовать имеющимся у вас ресурсам, то правильно будет профилировать его и искать возможности для устранения узких мест. В частности, следует обратить внимание на несколько моментов: возможности пакетного доступа к базе данных или файлам, а также проблемы несоответствия шаблонов доступа и оптимальных шаблонов доступа к структурам данных.
Спасибо за ваши комментарии, мой код должен принимать 7 разных строк в массиве 2d и вычислять среднее значение для каждого столбца из 7 строк. поэтому эти 7 циклов необходимы для генерации всех возможностей 7 строк в массиве. например 1234567, 1345678, 1456789..и т.д. Я также добавил условие, гарантирующее, что последовательность не будет дублироваться.
просто дело в том, что ваш код будет однопоточным, и ваш код показывает тип проблемы n ^ n.
Прошло некоторое время с тех пор, как я делал комбинации и перестановки (средняя школа). Но этот код ХУЖЕ, чем n! (факториальная) задача.
С помощью всего лишь моего скромного маленького ноутбука вы можете в расширенной компиляции отключить «удалить проверки целочисленного переполнения» - это ДЕЙСТВИТЕЛЬНО ускорит работу.
Итак, с вашим кодом следующим образом:
Dim maxNo As Integer
maxNo = 150
Dim startTime As DateTime = DateTime.Now
Dim MyTimeSpan As TimeSpan
Dim mycount As Long
For i = 1 To maxNo
For k = i To maxNo
For j = k To maxNo
For l = j To maxNo
For m = l To maxNo
For n = m To maxNo
For q = n To maxNo
mycount += 1
Next q
Next n
Next m
Next l
Next j
Next k
Next i
MyTimeSpan = DateTime.Now.Subtract(startTime)
TextBox1.Text = $"Time to run loop = { (MyTimeSpan.TotalMilliseconds) / 1000.0}"
TextBox2.Text = mycount
ТОЛЬКО значение 150?
Вы собираетесь запустить колоссальные и «поразительные» 389 МИЛЛИАРДОВ (да, это верно МИЛЛИАРД циклов!!).
Я получаю это:
Я также обнаружил, что работа с x86 (форсированный x32-битный проект), по-видимому, работает намного быстрее (нет необходимости заставлять ЦП работать с более крупными x64-битными кодами).
Итак, ваша проблема?
Вы должны рассмотреть меньшую проблему или, возможно, принять какой-то тип параллельной обработки. но даже при таком подходе ваши числа довольно велики, и поэтому вы имеете дело с большими объемами обработки.
Я думаю, вы правы, это огромное количество петель! Я думал, что мощный процессор — это решение, но оказалось, что это не так. Я попробую отключить целочисленную проверку, как вы, и посмотреть, может ли это помочь, если нет, я увижу другой алгоритм для моей проблемы. большое спасибо за ваше время :)
Вероятно, проблема не в самих циклах, а скорее в том, что вы делаете внутри цикла. Возможны некоторые стратегии, возможно, с использованием потоков или асинхронных методов, но, не видя, что вы хотите сделать, трудно помочь.