我们知道反射是一个相当昂贵的引擎。但尽管如此,ASP.NET MVC 充满了它。还有很多方法可以使用和实现其他基于反射的实践,例如 ORM、DTO 实体视图模型之间的不同映射、DI 框架、JSON 解析等等。
所以我想知道它们是否都会对性能产生如此大的影响,以至于强烈建议尽可能避免使用反射并找到其他解决方案,如脚手架等?执行服务器负载测试的工具是什么?
2 回答
反射没有错。只需明智地使用它,也就是缓存结果,这样您就不必一遍又一遍地执行那些昂贵的调用。反射在 ASP.NET MVC 中被广泛使用。例如,当从路由中解析控制器和动作名称时,使用反射找到相应的方法来调用。除了一旦找到,结果就会被缓存,以便下次有人请求相同的控制器和动作名称时,从缓存中获取要调用的方法。
因此,如果您使用第三方框架,请检查文档/源代码是否使用反射以及是否缓存这些调用的结果。
如果你必须在你的代码中使用它,同样的规则适用 => 缓存它。
对于压力测试,这篇 SO 帖子提供了很多可能性:Stress Testing ASP.Net application。
我自己也思考过这个问题,得出以下结论:
大多数人不会花时间一遍又一遍地重新提交页面。考虑到访问实际网站所花费的时间,用户花费在最坏情况下包含一些 Ajax 调用的页面的阅读和消费时间是最少的。即使您的应用程序有 100 万并发用户,您通常也不必在任何给定时间处理一百万个请求。
Web 自然是基于字符串比较... HTTP 响应中没有类型,因此任何 Web 应用程序都被迫将这些类型的任务作为日常生活的事实来处理。字符串比较和动态对象越少越好,但它们的核心是不可避免的。
尽管通过字符串比较进行映射或动态类型检查之类的操作很慢,但使用 PHP 等非编译、弱类型语言构建的站点将包含更多此类操作。尽管与 C# 控制台应用程序相比,MVC 中可能出现的性能问题很多,但它仍然是 Web 域中许多其他解决方案的优越解决方案。
任何框架的使用都会产生与之相关的性能成本。使用 .NET 框架以 C# 构建的应用程序在所有意图和目的上都不会像用 C++ 编写的应用程序那样执行。然而,好处是更好的可靠性、更快的编码时间和更容易的测试等等。考虑到计算机的速度在过去十年或两年中是如何爆炸式增长的,我们已经开始接受在这里和那里多花几毫秒来换取这些好处(这是巨大的)。
鉴于这些观点,在开发 ASP.NET MVC 应用程序时,我不会避免诸如瘟疫之类的反射之类的事情,因为很明显它们可以对应用程序的运行方式产生相当积极的影响。它们是工具,如果使用得当,对许多应用程序都有很大的好处。
至于性能,我喜欢构建我能做到的最佳解决方案,然后返回并对其进行压力测试。也许我在 X 类中实现的反射毕竟不是性能问题?简而言之,我的第一个任务是构建一个伟大的架构,我的第二个任务是优化它以从中榨取每一滴性能。