【问题标题】:ASP.NET How expensive is it to call an Application Variable many times?ASP.NET 多次调用应用程序变量的成本是多少?
【发布时间】:2009-03-29 08:53:24
【问题描述】:

简而言之:每次加载页面时检查 Application("WebAppName") 等应用程序变量 10-20 次是否成本高昂?

背景:(欢迎批评)

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

因此这些包括包含

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

像这样继续调用应用程序变量是否昂贵?

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

重要提示:

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

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

【问题讨论】:

    标签: asp.net performance web-applications path


    【解决方案1】:

    它很便宜 - 非常非常便宜 - 只是一个字典查找。与您在应用中执行的几乎所有其他操作(从磁盘或网络加载)相比,这将是统计噪音。

    一般来说,如果您担心此类事情,最好的办法是测量。任意将 10,000 个调用放入一个页面,看看这如何影响性能。看看它是如何影响并发性的 - 在处理多个并发请求时,您还能获得所需的吞吐量吗?

    【讨论】:

    • 为了 OP 的利益;特别是,与查询数据库或将 http/html 响应返回给客户端相比,它可笑便宜; 10-20 次,不太可能导致明显的瓶颈,呃,永远。
    • 我会让我的回答更加强调:)
    【解决方案2】:

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

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

    这在 MVC 中特别有效,您可以编写一个扩展方法来完成这项工作,即

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

    【讨论】:

    • 非常有帮助。谢谢你的提示。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        简答 - 衡量它并根据您自己的环境做出决定。我会说没关系。

        更长的答案-无论如何,您都应该将呼叫包裹在某些东西中...例如WebConfiguration.Root。 这将使您可以选择在未来的任何时间对其进行任何优化。

        【讨论】:

          猜你喜欢
          • 2011-08-09
          • 2010-11-15
          • 1970-01-01
          • 2010-09-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多