Эффективный один алгоритм из этих двух алгоритмов

У 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()
3
задан ggorlen 19 January 2019 в 04:33
поделиться

1 ответ

Сложность времени в современном процессоре может быть практически бесполезной статистикой производительности.

В этом случае у нас есть один алгоритм, который идет от 0 до n-1 - O (N) - и второй, который идет от 0 до n-1 дважды - константа выпадает, поэтому она все еще O (N) , Первый алгоритм имеет дополнительный оператор if, который будет ложным ровно один раз, и приличный компилятор уничтожит его. Мы получаем одинаковое количество входных данных, одинаковое количество выходных данных, одинаковое количество обращений к массиву (своего рода) и одинаковое количество if (a>b).

То, что у второго есть, чего у первого нет, так это детерминизм. Один цикл определяет все для второго. Все входные данные считываются в первом цикле. Это означает, что ЦП может точно видеть, что произойдет раньше времени, потому что он имеет все числа и, таким образом, точно знает, как пойдет каждая ветвь if, и может предсказать со 100% точностью загрузку кешей, и заполнить трубопроводы, чтобы все было готово заранее, не пропуская ни секунды.

Алгоритм 1 не может этого сделать, потому что следующий вход не известен до следующей итерации цикла. Если шаблон ввода не является предсказуемым, он будет догадываться, в каком направлении if(p[i-1]>p[i]) часто идет не так.

Дополнительное чтение: Почему быстрее обрабатывать отсортированный массив, чем несортированный массив?

0
ответ дан user4581301 19 January 2019 в 04:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: