通过参考性能C#.net传递值和传递
我基本上创建了一个轻量级类,它传递了大约10个参数,它不会改变这些参数,它只是在构造函数中将它们存储在本地。
一些是引用类型(字符串,类),其他是值类型(int,bool,enums)。
我的问题是我应该用关键字’ref’传递这些(除了我的类)吗?
我在这里考虑的是表现。
如果方法需要更改参数,则仅使用ref
,并且需要将这些更改传递到调用代码。 如果您通过分析器运行它并确定瓶颈确实是CLR将方法参数复制到堆栈上,则应该只对此进行优化。
请记住,CLR针对使用参数调用方法进行了大量优化,所以我不应该认为这是问题所在。
对于参考类型,您已经传递了一个引用,除非您想要更改引用指向的内容,例如为其分配新对象,否则无需通过引用传递引用。 对于值类型,您可以通过引用传递,但除非您遇到性能问题,否则我不会这样做。 特别是如果所讨论的类型很小(4字节或更少),则几乎没有性能增益,甚至可能是惩罚。
我发现在高容量函数调用更大的值类型,通过ref更快,稍微。 如果你有大量的函数调用和需要速度,这可能是一个考虑因素。 我愿意接受替代证据。
public static void PassValue(decimal value) { } public static void PassRef(ref decimal value) { } decimal passMe = 0.00010209230982047828903749827394729385792342352345m; for (int x = 0; x < 20; x++) { DateTime start = DateTime.UtcNow; TimeSpan taken = new TimeSpan(); for (int i = 0; i < 50000000; i++) { PassValue(passMe); } taken = (DateTime.UtcNow - start); Console.WriteLine("Value : " + taken.TotalMilliseconds); start = DateTime.UtcNow; for (int i = 0; i < 50000000; i++) { PassRef(ref passMe); } taken = (DateTime.UtcNow - start); Console.WriteLine("Ref : " + taken.TotalMilliseconds); }
结果:
Value : 150 Ref : 140 Value : 150 Ref : 143 Value : 151 Ref : 143 Value : 152 Ref : 144 Value : 152 Ref : 143 Value : 154 Ref : 144 Value : 152 Ref : 143 Value : 154 Ref : 143 Value : 157 Ref : 143 Value : 153 Ref : 144 Value : 154 Ref : 147 Value : 153 Ref : 144 Value : 153 Ref : 144 Value : 153 Ref : 146 Value : 152 Ref : 144 Value : 153 Ref : 143 Value : 153 Ref : 143 Value : 153 Ref : 144 Value : 153 Ref : 144 Value : 152 Ref : 143
如果类只持有参数,你应该使用结构吗?
也许这是有意义的?
何时使用struct?
不能。通过引用传递参数会增加开销,因此只会降低性能。
据我所知,你有一个只有字段的类和一个将参数分配给那些字段的构造函数,对吧?
如果是这种情况,我会考虑在构造函数中使用ref。 如果将参数分配给该类中的字段,则无论如何都会按值存储该参数。 因此,如果您不更改构造函数中的值,则无需通过引用使用它。
我不确定c#,但是对于c ++ / c,它取决于你传递的内容。 如果你传递一个基类型(int,float,double,char)….那么按值传递比通过引用传递更快(因为函数调用是针对此优化的。如果你传递更大的东西,一个大类,一个数组,长字符串…然后通过引用传递更快,因为如果你正在做一个int [100000]那么处理器将不得不分配一个100000 x 32/64(取决于架构)块,然后复制所有值都超过了,这需要花费很多时间。而引用只是传递一个指针
C#将大部分内容抽象出来,所以我不知道它的作用,但我认为在效率方面适用于c ++ / c的内容通常适用于c#。