3

我目前正在构建一个将由 Web 服务使用的 API。

我想知道如果我使用大量静态方法构建我的 API 会遇到哪些性能问题。

最初的想法是构建充当服务的专家对象。

在单一用户环境中,这种方法很棒!但我很快需要将其移植到多/并发用户环境。

这种架构可能会遇到什么样的性能问题?

最好的祝福,

编辑:

静态方法不包含静态变量并且没有副作用。他们只是执行一个正常的例程,一切都被实例化。(即变量和对象)

4

3 回答 3

10

对并发没有特别的影响。同样的规则是正确的:同时改变共享数据是不好的。如果你有实例方法但它们不会改变任何东西,那你很好。

不过,一般设计有所不同 - 静态方法几乎总是应该是线程安全的(即您应该使它们成为线程安全的),而实例方法通常不必是(尽管您应该记录类的线程安全性)。

于 2009-02-04T13:42:30.340 回答
3

您不必担心静态方法中的局部变量。每个线程都有自己的堆栈,每次调用该方法都会在堆栈上创建局部变量的单独副本。例如,MS 在其应用程序块中提供的 SqlHelper 方法就使用了这种技术。

主要问题是静态变量。我几乎从不使用静态变量,我没有必要。

于 2009-02-09T08:59:00.450 回答
2

我不太关心性能问题(Knuth),我更关心多线程环境中的可测试性和管理状态问题,主要是为了降低编码和维护的复杂性,这可能会拖累项目比偶尔的性能问题。

您不能模拟静态,因此使用基于静态方法的 API 的代码相对无法测试恕我直言。不是您真正要问的,但请考虑将要使用您的 API 的人。

您应该将线程之间保存共享数据的点减少到绝对最小值。这减少了线程问题的机会。这样做您可能会损失一点效率,但您会在编码和维护方面获得很多好处。想象一下,如果所有页面都是静态的,那么编写和测试 ASP.NET 应用程序将是多么困难。这将是一场噩梦。随着您的 API 随着时间的推移获得功能,您可能会发现自己正在走这条路。

此外,使用一个体面的 DI 框架(我认为 Unity,可能是 P&P 中最好的东西)。

于 2009-02-04T13:56:04.807 回答