Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 局部变量与实例变量_C#_.net_Optimization_Instance_Local - Fatal编程技术网

C# 局部变量与实例变量

C# 局部变量与实例变量,c#,.net,optimization,instance,local,C#,.net,Optimization,Instance,Local,我一直在为我用XNA构建的游戏做大量关于C#优化的研究,但我仍然不太清楚局部变量是否是实例变量,在不断更新和使用时是否能提供更好的性能 根据,您应该避免使用参数和局部变量,这意味着实例变量是性能方面的最佳选择 但不久前,我在另一篇StackOverflow文章(我似乎找不到它在哪里)上读到,局部变量存储在内存中一个访问速度快得多的部分,并且每次设置实例变量时,在分配新值之前,作为一个繁琐的额外步骤,必须删除以前的值 我知道在设计方面,在这种情况下使用实例变量可能会破坏封装,但我对性能非常好奇。目

我一直在为我用XNA构建的游戏做大量关于C#优化的研究,但我仍然不太清楚局部变量是否是实例变量,在不断更新和使用时是否能提供更好的性能

根据,您应该避免使用参数和局部变量,这意味着实例变量是性能方面的最佳选择

但不久前,我在另一篇StackOverflow文章(我似乎找不到它在哪里)上读到,局部变量存储在内存中一个访问速度快得多的部分,并且每次设置实例变量时,在分配新值之前,作为一个繁琐的额外步骤,必须删除以前的值

我知道在设计方面,在这种情况下使用实例变量可能会破坏封装,但我对性能非常好奇。目前在我的游戏中,我将局部变量传递给类中7个方法中的3个,但我可以轻松地将变量提升为实例变量,并且能够完全避免参数传递和局部变量


那么哪一个更好呢?

就我个人而言,我不会认为这是性能问题的罪魁祸首(除非您不断地传递大型
结构)。我天真的理解是,GC压力是XNA游戏通常考虑的因素,因此基本上要节约使用对象实例

如果变量是方法局部变量,则值本身或引用(当引用类型为时)将位于堆栈上。如果将这些变量升级为类成员变量,它们将位于堆上的类内存中

方法调用在技术上会变得更快,因为您不再复制调用上的引用或值(因为如果该方法也是类的本地方法,那么您可能可以从该方法中删除参数)

我不确定相对性能,但对我来说,如果你需要保持这个值,那么这个值在类中是有意义的

在我看来,两人之间的细微差别似乎超过了从一方对另一方有利中获得的任何潜在收益,这使得他们之间的差别大致相等,或者相差太小以至于不在乎


当然,面对性能评测中的硬性数字,所有这些都将得到纠正。

不传递参数会稍微快一些,不初始化本地对象(如果它们是对象)会更快一些

两篇文章中读到的内容并不矛盾,一篇提到传递参数需要花费时间,另一篇提到初始化对象(在本地对象中)也需要花费时间

关于分配新对象,您可以做的一件事是重用对象,而不是丢弃它们。例如,不久前,我不得不为交易员编写一些代码,用C/C++和C#实时计算一些产品的价格。我没有从头开始重新创建等式系统,而只是从以前的系统增量更新了系统,从而大大提高了性能

这避免了为新对象分配内存,初始化新对象,而且系统通常几乎是相同的,因此我只需修改微小的位来更新它


通常,在进行任何优化之前,您希望确保您正在优化将对总体性能产生重大影响的内容?

您的变量是引用(类或字符串)还是值(结构)类型

对于引用类型,将它们作为方法参数传递和在对象实例上保留它们之间没有什么有意义的区别。在第一种情况下,当输入函数时,参数(对于参数计数较小的函数)将在寄存器中结束。在第二种情况下,引用作为“this”在内存中指向的数据的偏移量存在。这两种情况都是快速获取内存地址,然后从内存中取出相关数据(这是昂贵的部分)

对于值类型,对于某些类型(可以放入CPU寄存器的整数或浮点数),上述情况是正确的。对于那些特定的东西,通过价值传递可能比从“这个”中提取要便宜一些。对于其他值类型(DateTime或struct,您可以自己创建,也可以创建任何具有多个成员的结构),当数据太大而无法通过寄存器传入时,这不再重要


但是,这些都不太可能影响应用程序(甚至是游戏)的性能。最常见的.NET性能问题(不仅仅是低效的算法)在某种程度上来自垃圾生成。这可能通过意外装箱、字符串构建使用不当或对象生命周期管理不当(对象的生命周期既不是很短也不是很长/永久)来表现出来。

您的程序运行缓慢吗?如果您应该避免使用参数和局部变量,那么您可能根本就应该避免使用c#,因为您将编写一个不可读的程序。这种“优化”通常对性能没有影响。通常其他地方存在更明显的性能陷阱。您是否有任何可测量的性能问题?你能分析一下你的代码,看看问题是来自这样的微优化还是更大的问题?(或者这只是一个好奇的问题:)我也非常怀疑访问局部变量或Instance变量是否是任何.Net应用程序中的瓶颈……我认为OP提出的是一个一般的理论问题,而不是指导。我认为他根本不打算通过避免传递参数来进行优化。将参数提升到字段不会阻止优化将其放入寄存器吗?啊,很有趣。我的主要目标是,在编写新代码而不是优化代码时,尝试制定一条经验法则,指导我应该朝着什么方向努力。那么你会说在90%-99%的情况下,使用实例吗