ASP.NET Сколько стоит многократно вызывать переменную приложения? - PullRequest
3 голосов
/ 29 марта 2009

Суть в следующем: стоит ли проверять переменную приложения, такую ​​как приложение ("WebAppName"), более 10-20 раз при каждой загрузке страницы?

Фон: (не стесняйтесь критиковать)

Некоторые включения на моем сайте содержат много ссылок и изображений, которые не могут использовать относительные URL из-за их включения в различные пути.

Следовательно, они включают частые случаи

<img src="<%=Application("Webroot")%>images\image.gif">

Дорого ли продолжать вызывать переменную Application, подобную этой?

Должен ли я просто поместить значение Application в некоторую локальную переменную для использования там, где это необходимо?

ВАЖНОЕ ПРИМЕЧАНИЕ:

Мне нужно, чтобы мое веб-приложение нормально работало на сервере, будь то в корневой сети ("/") или в виртуальном веб-каталоге ("/app").

Заранее благодарен за любую мудрость.

Ответы [ 5 ]

4 голосов
/ 29 марта 2009

Просто для информации, другой вариант:

<img src="<%=VirtualPathUtility.ToAbsolute("~/images/image.gif")%>"

Это хорошо работает, особенно в MVC, где вы можете написать метод расширения для выполнения работы, т.е.

<%=Html.Image("~/images/image.gif")%>
4 голосов
/ 29 марта 2009

Это дешево - очень, очень дешево - просто поиск по словарю. По сравнению почти со всем, что вы будете делать в приложении (загрузка чего-либо с диска или из сети), это будет статистический шум.

В общем, лучше всего, если вы беспокоитесь о таких вещах, как измерить . Произвольно поместите 10000 звонков на страницу и посмотрите, как это влияет на производительность. Посмотрите, как это влияет и на параллелизм - можете ли вы по-прежнему получать необходимую пропускную способность при обработке нескольких параллельных запросов?

2 голосов
/ 29 марта 2009

Объект Application представляет собой синхронизированную коллекцию, которая использует ReadWriteObjectLock (внутренний класс, который использует только ключевое слово lock), поэтому, если вы только читаете из коллекции, это будет так же быстро, как поиск в хеш-таблице, как упоминал Джон, но если в то время как кто-то пишет в эту коллекцию, читатели будут блокировать, пока запись не будет завершена. Если вы так сильно беспокоитесь о производительности, вызовите индексатор один раз, сохраните его в локальной переменной и используйте эту переменную в своих представлениях.

0 голосов
/ 29 марта 2009

Краткий ответ - измерьте это и определитесь со своей средой. Я бы сказал, что это не имеет значения.

Более длинный ответ - вы все равно должны обернуть вызов во что-то ... Как WebConfiguration.Root. Это даст вам возможность оптимизировать его в любое время в будущем.

0 голосов
/ 29 марта 2009

Вместо этого используйте Request.ApplicationPath (работает, только если ваше приложение настроено как виртуальный каталог в IIS)

...