ASP.NET多次调用应用程序变量有多昂贵?

时间:2009-03-29 08:53:24

标签: asp.net performance web-applications path

缺点是:每次加载页面时,检查应用程序变量(例如应用程序(“WebAppName”)的次数是否超过10-20倍?

背景:(随意批评)

我网站中的某些内容包含许多链接和图片,这些链接和图片由于包含在不同的路径中而无法使用相对网址。

因此,这些包括

的频繁实例
<img src="<%=Application("Webroot")%>images\image.gif">

继续像这样调用Application变量是否很昂贵?

我应该将Application值放在某个局部变量中以便在需要的地方使用吗?

重要提示:

我需要我的webapp在服务器上正常运行,无论它是在根网站(“/”)还是在虚拟子网站(“/ app”)中。

提前感谢任何分享的智慧。

5 个答案:

答案 0 :(得分:4)

它很便宜 - 非常非常便宜 - 只是字典查找。与您在应用程序中执行的任何其他操作(从磁盘或网络加载内容)相比,这将是统计噪音。

总的来说,如果你担心这样的事情,最好的办法是衡量它。任意将10,000个调用放入页面,看看它如何影响性能。了解它如何影响并发性 - 在处理多个并发请求时,您仍然可以获得所需的吞吐量吗?

答案 1 :(得分:4)

仅供参考,另一种选择是:

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

这在MVC中效果很好,在MVC中你可以编写一个扩展方法来完成这项工作,即

<%=Html.Image("~/images/image.gif")%>

答案 2 :(得分:2)

Application对象是一个使用ReadWriteObjectLock(一个只使用lock关键字的内部类)的同步集合,所以如果你只是从集合中读取它会像Jon提到的哈希表查找一样快,但如果在有人写这个集合的同时,读者会阻止写作完成。如果您对性能非常担心,请调用索引器一次,将其存储到局部变量并在视图中使用此变量。

答案 3 :(得分:0)

改为使用Request.ApplicationPath(仅当您的应用在IIS中设置为虚拟目录时才有效)

答案 4 :(得分:0)

简短回答 - 测量并决定您自己的环境。我想说没关系。

更长的答案 - 无论如何你应该将调用包裹起来......就像WebConfiguration.Root一样。 这将使您可以选择在将来的任何时间对其进行任何优化。