通过将方法参数作为参考类型,可以获得性能提升吗?

时间:2010-11-08 06:11:45

标签: c#

我有一个公共方法,它反复调用其他几个私有方法。这些私有方法接受一个或多个参数(大多数是字符串)并具有返回类型。所有这些参数都是值类型参数。

我想知道我是否可以提高我的ASP.NET应用程序的性能,将所有这些值类型参数转换为引用类型,因为引用类型的内存消耗将远远小于值类型的内存消耗。

提前致谢。

4 个答案:

答案 0 :(得分:7)

除非你的价值类型很大,否则这可能是不必要的微观优化。如果是,您可能想重新考虑您的设计。

与往常一样,首先要确定真正的瓶颈所在。

答案 1 :(得分:4)

代码:

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;
}

没有参考:

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

非常基本的测试,但它似乎在最基本的情况下没有区别。

答案 2 :(得分:1)

不,在正常情况下,它只会增加通过引用传递参数的开销。

如果由于您的值类型很大而遇到性能问题,问题的根源就是值类型的设计,您应该在哪里解决问题。

根据Microsoft的建议,值类型不应大于16个字节。如果它们更大,它们将不会表现良好。可以使用一个或两个CPU指令复制小值类型,而使用循环复制较大值类型。

如果您使用的是类,则默认情况下它们将作为引用传递。

答案 3 :(得分:0)

我想是的。但除非你将这些方法称为几百万次,否则你不会看到差异。 这个实际上只适用于较大的结构。整数等应该没有感染。