EDIT: Это не вопрос о том, можно ли использовать инструкцию GoTo.Есть ли способ написать это без инструкции GoTo?
Это вопрос о том, как обращаться с центром в O алгоритма (п^3) в .NET/IL без используя заявление GoTo. Сторонники и попутчики философии Дейкстры, пожалуйста, обратите внимание, прежде чем не прочитать этот вопрос.
Рассмотрим следующий код, в котором для большинства случаев использование цикла For o = 0 to nz
будет выполняться от 3 до 18 миллионов раз. Подпрограмма занимает свое место в моем коде как аргумент для вызова Parallel.For(). Область m
, ny
и nz
все между 10 и 300.
Это ручной оптимизирован, чтобы избежать стека выталкивает и вызовы подпрограмм, другими словами, для скорости. Мое желание состоит в том, чтобы избежать компиляции IL, которая включает в себя код операции calli
или call
внутри самого внутреннего цикла.
Чтобы прервать самую внутреннюю три петли после завершения теста, я использую инструкцию GoTo для отмены ненужных тестов.
Вопрос в том, есть ли способ кодировать это без GoTo? Есть ли способ закодировать код, который компилятор .net JIT-компилятор будет компилировать для более быстрого кода без call
или calli
операций с кодами операций, заканчивающимися в коде объекта?
Sub SomeLambda(m As Integer, newarray As Short(,,))
For n = 0 To ny
For o = 0 To nz
If newarray(m, n, o) <> 1 AndAlso newarray(m, n, o) <> -1 Then
For m1 = m - 1 To m + 1
For n1 = n - 1 To n + 1
For o1 = o - 1 To o + 1
If SomeCondition = True Then 'the array is not out of bounds '
Dim testVal = newarray(m1, n1, o1)
If testVal = -1 Then
newarray(m, n, o) = -2
GoTo Exitloopslabel2
End If
End If
Next
Next
Next
Exitloopslabel2:
End If
Next
Next
End Sub
Большинство людей сказали бы, что вы должны реорганизовать вложенные циклы, чтобы избежать goto, но если у вас есть основания полагать, что вызовы подпрограмм будут слишком дорогими (т. Е. Вы его измерили), то это действительно единственное решение. – siride
Не дубликат: другой вопрос предлагает решение, которое формирует образец кода моего вопроса. Было бы неплохо, если бы кто-то опубликовал ответ, который я могу возместить и одобрить, а не просто комментарий. –
@RobPerkins: Интересно, это лучший вопрос для программистов.stackexchange.com? Мне не нравится балканизация сайтов SE, но это то, что есть. – siride