我有一个公共方法,它反复调用其他几个私有方法。这些私有方法接受一个或多个参数(大多数是字符串),并具有返回类型。所有这些参数都是值类型参数。
我想知道是否可以通过将所有这些值类型参数转换为引用类型来提高ASP.NET应用程序的性能,因为引用类型的内存消耗将比值类型少得多。
提前谢谢。
发布于 2010-11-08 06:13:56
除非你的值类型很大,否则这可能是一个不必要的微优化。如果是这样的话,您可能需要重新考虑您的设计。
一如既往,首先进行基准测试,看看真正的瓶颈在哪里。
发布于 2010-11-08 06:22:48
代码:
while (true)
{
Stopwatch watch = new Stopwatch();
watch.Start();
Int64 myNum = 123456789;
for (int i = 0; i < 10000000; i++)
{
myNum++;
DoSomething(myNum);
}
watch.Stop();
Console.WriteLine("Time: " + watch.ElapsedMilliseconds + "ms");
}
private void DoSomething(Int64 bigNum)
{
Int64 fake = bigNum - 1;
}
不带ref:
Time: 237ms
Time: 245ms
Time: 252ms
Time: 237ms
Time: 235ms
带ref:
Time: 242ms
Time: 238ms
Time: 232ms
Time: 248ms
Time: 232ms
Time: 233ms
Time: 232ms
非常基本的测试,但在最基本的情况下似乎没有什么不同。
发布于 2010-11-08 06:24:30
不,在正常情况下,它只会增加通过引用传递参数的开销。
如果由于值类型太大而出现性能问题,那么问题的根源在于值类型的设计,而这正是您应该解决问题的地方。
根据Microsoft的建议,值类型不应大于16个字节。如果他们更大,他们将不会有很好的表现。可以使用一条或两条CPU指令复制较小的值类型,而使用循环复制较大的值类型。
如果改用类,则默认情况下它们将作为引用传递。
https://stackoverflow.com/questions/4121652
复制