У VB есть некоторые смешные идеи о синтаксисе запроса LINQ.
Вы можете переключиться на синтаксис лямбда или поместить круглые скобки вокруг переменной в Select
:
Dim newList = valueList.Where(Function(value) Integer.TryParse(value, newValue)).Select(Function(value) newValue).ToList()
Dim newList As List(Of Integer) = (
From value In valueList
Where Integer.TryParse(value, newValue)
Select (newValue)).ToList()
Сложность времени в современном процессоре может быть практически бесполезной статистикой производительности.
В этом случае у нас есть один алгоритм, который идет от 0 до n-1 - O (N) - и второй, который идет от 0 до n-1 дважды - константа выпадает, поэтому она все еще O (N) , Первый алгоритм имеет дополнительный оператор if
, который будет ложным ровно один раз, и приличный компилятор уничтожит его. Мы получаем одинаковое количество входных данных, одинаковое количество выходных данных, одинаковое количество обращений к массиву (своего рода) и одинаковое количество if (a>b)
.
То, что у второго есть, чего у первого нет, так это детерминизм. Один цикл определяет все для второго. Все входные данные считываются в первом цикле. Это означает, что ЦП может точно видеть, что произойдет раньше времени, потому что он имеет все числа и, таким образом, точно знает, как пойдет каждая ветвь if
, и может предсказать со 100% точностью загрузку кешей, и заполнить трубопроводы, чтобы все было готово заранее, не пропуская ни секунды.
Алгоритм 1 не может этого сделать, потому что следующий вход не известен до следующей итерации цикла. Если шаблон ввода не является предсказуемым, он будет догадываться, в каком направлении if(p[i-1]>p[i])
часто идет не так.
Дополнительное чтение: Почему быстрее обрабатывать отсортированный массив, чем несортированный массив?