ASP.NET调用应用程序变量多次的成本有多高?

3

简而言之: 在每次页面加载时检查应用程序变量,例如Application("WebAppName")的成本高吗?

背景:(欢迎批评)

我的网站中有一些包含许多链接和图像的文件,由于它们包含在不同的路径中,因此不能使用相对URL。

因此,这些文件中经常出现许多实例:

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

像这样频繁调用应用程序变量会很昂贵吗?

我应该将应用程序值放在某个本地变量中,在需要时使用吗?

重要提示:

我需要我的 Web 应用程序在服务器上正常运行,无论是在根 Web ("/") 还是在虚拟子 Web ("/app") 中。

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

5个回答

4

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

然而,总的来说,如果你担心这样的事情,最好的做法是进行测量。随意将10,000个调用放入页面中,看看它如何影响性能。同时,看看它对并发性的影响 - 当处理多个并发请求时,你仍然可以获得所需的吞吐量吗?


为了OP的利益,特别是与查询数据库或将http/html响应返回给客户端相比,它非常便宜;在10-20倍的情况下,它很难引起明显的瓶颈。 - Marc Gravell
我会更加强调我的答案 :) - Jon Skeet

4

仅供参考,另一个选项是:

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

这对于MVC尤其有效,你可以编写一个扩展方法来完成工作,例如:

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

2

应用程序对象是一个同步的集合,它使用ReadWriteObjectLock(一个仅使用锁关键字的内部类),因此如果您只从集合中读取数据,则速度将与Jon提到的哈希表查找一样快。但是,如果同时有人在向该集合写入数据,读取者将被阻塞,直到写操作完成。如果您非常担心性能问题,请调用索引器一次,将其存储到本地变量中,并在视图中使用此变量。


0
使用Request.ApplicationPath代替(仅适用于将您的应用程序设置为IIS中的虚拟目录)

0

简短回答 - 测量并决定自己的环境。我认为这并不重要。

更长的回答 - 无论如何,您都应该将调用包装在某些东西中...比如WebConfiguration.Root。 这将使您随时可以对其进行任何优化。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接