Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException
вообще.
См. также: A хороший список лучших практик
Я бы добавил, очень важно, хорошо использовать модификатор final
. Использование "окончательной" модификатор, когда это применимо в Java
Сводка:
final
для обеспечения хорошей инициализации. @NotNull
и @Nullable
if("knownObject".equals(unknownObject)
valueOf()
поверх toString (). StringUtils
StringUtils.isEmpty(null)
. Я задал этот вопрос на форумах MS, которые получили ответ от разработчика MVC MS.
Ответ
От Предварительного просмотра MVC 2 к недавно выпущенной Бете MVC со вчерашнего дня было много изменений в Маршрутизации. Некоторые из тех изменений включают повышения производительности. Вот некоторые приемы для создания поколения URL более производительным в приложении:
Используйте названные маршруты. Названные маршруты являются дополнительной функцией маршрутизации. Имена только относятся к поколению URL - они никогда не используются для соответствия входящим URL. Когда Вы укажете имя при генерации URL, мы только попытаемся соответствовать тому одному маршруту. Это означает, что, даже если именованный маршрут Вы указали, 100-й маршрут в таблице маршрутизации, мы перейдем прямо к нему и попытаемся соответствовать.
Поместите свои наиболее распространенные маршруты в начале таблицы маршрутизации. Это улучшит производительность обоих поколений URL, а также обрабатывающий входящие URL. Маршрутизация работ на основе правила, что первое соответствие побеждает. Если первое соответствие является 100-м маршрутом в Вашей таблице маршрутизации, то это означает, что должно было попробовать 99 других маршрутов и ни одного из них подобранный.
Не используйте поколение URL. Некоторые люди как он, некоторые люди не делают. Это немного хитро ведущему устройству. Хорошо использовать, если Ваши URL являются очень динамичными, но это может быть что-то вроде стычки, когда у Вас есть очень немного URL для начала, и возможно Вы не заботитесь о точно, на что они похожи.
Моя любимая опция является № 1, так как это супер просто в использовании, и это также делает поколение URL более детерминированным из перспективы разработчика приложения (это - Вы!).
Кэширование ссылок, вероятно, было бы хорошим предложением для команды, поскольку они не изменятся для жизни процесса (для большинства приложений так или иначе).
, Пока Вы не начинаете определять свои маршруты в настраиваемой форме (такие как web.config или в базе данных) тогда, необходимо было бы сократить немного.
я подозреваю, что большая часть задержки на среднем примере является анонимным типом, который автоматически преобразовывается в словарь. Кэширование URL не помогло бы здесь b/c, необходимо будет все еще отразить тот тип.
Тем временем, можно создать собственные вспомогательные методы для некоторых из тех основанных на словаре ссылок, которые берут точный вход, которого Вы требуете. Тогда можно обработать кэширование себя.
Кэширующиеся ссылки, вероятно, были бы хорошим предложением для команды, поскольку они не изменятся для жизни процесса (для большинства приложений так или иначе).
, Как можно кэшировать ссылки, Вы не можете сделать этого насколько я знаю, потому что необходимо кэшировать метод, который выполняется, который происходит после того, как маршрут разрешен, который является медленной частью.
Хорошо, две дополнительных метрики на пустом шаблонном проекте:
<%= Bechmark(() => Url.Action("Login", "Account", new Dictionary<string, object> {{"username", "bla"}, {"password", "bla2"}, {"returnurl", "blabla32"}, {"rememberme", "false"}})) %>
<%= Bechmark(() => Url.Action("Login", "Account", new RouteValueDictionary(new Dictionary<string, object> {{"username", "bla"}, {"password", "bla2"}, {"returnurl", "blabla32"}, {"rememberme", "false"}}))) %>
Результаты:
71 мс, 0,071 мс за ссылку
35 мс, 0,035 мс за ссылку
Намного лучшая производительность с путем более противный код. Слишком плохо.