我有一个公共方法,它反复调用其他几个私有方法。这些私有方法接受一个或多个参数(大多数是字符串)并具有返回类型。所有这些参数都是值类型参数。
我想知道我是否可以提高我的ASP.NET应用程序的性能,将所有这些值类型参数转换为引用类型,因为引用类型的内存消耗将远远小于值类型的内存消耗。
提前致谢。
答案 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)
我想是的。但除非你将这些方法称为几百万次,否则你不会看到差异。 这个实际上只适用于较大的结构。整数等应该没有感染。