gpt4 book ai didi

c# - 声明变量时的性能问题

转载 作者:行者123 更新时间:2023-11-30 18:58:42 28 4
gpt4 key购买 nike

在下一种情况下声明新变量是否有任何性能成本:

这个例子只是为了说明这一点。

public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
public int Age { get; set; }
}

我有下一个方法:

选项 1:

public void MyMethod(Person person)
{
if (person.FirstName.Contains("Ro") || (person.LastName.StartsWith("A") && person.Age > 20))
{
//Do something
}
else if (person.FirstName.Contains("Ko") || (person.LastName.StartsWith("B") && person.Age >= 40))
{
//Do something
}
else if (person.FirstName.Contains("Mo") || (person.LastName.StartsWith("C") && person.Age > 60))
{
//Do something
}
else
{
//Do something
}
}

选项 2:

public void MyMethod(Person person)
{
string firstName = person.FirstName;
string lastName = person.LastName;
int age = person.Age;

if (firstName.Contains("Ro") || (lastName.StartsWith("A") && age > 20))
{
//Do something
}
else if (firstName.Contains("Ko") || (lastName.StartsWith("B") && age >= 40))
{
//Do something
}
else if (firstName.Contains("Mo") || (lastName.StartsWith("C") && age > 60))
{
//Do something
}
else
{
//Do something
}
}

同样,这只是演示问题思路的示例。

问题:选项 1 和选项 2 之间是否存在任何性能或内存问题?

可以肯定的是,选项 2 看起来更好并且更易读。

最佳答案

这是通过抖动解决的,它积极地消除方法的局部变量,并寻找将它们存储在 CPU 寄存器中的方法。无论您是否自己声明变量,它都会这样做。您的属性 getter 很简单并且没有副作用,抖动可以自行发现。那些 getter 方法也被删除了,它们是内联的。实际上,它将您的代码从第一个片段转换为第二个片段。

这就是无法通过Reflection查出一个方法有哪些局部变量的核心原因。以及为什么您在调试优化代码时遇到问题。以及为什么 C# 中存在 volatile 关键字。当抖动优化器完成时,局部变量就不再存在了。

您会在 this answer 中找到抖动执行的优化类型的概述。 .

所以,不,不要犹豫,通过这种方式让您的代码更具可读性,预计不会对性能产生任何影响。但是请记住,您可以在执行此操作的代码中引入错误,当您的其余代码影响您正在使用的对象时,它将触发。您当然会存储该属性的陈旧值。如果类不是平凡的并且属性 getter 本身有副作用,这并不总是那么明显。否则,.NET 中的编码指南要求具有副作用的属性应该是方法的核心原因。

关于c# - 声明变量时的性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23470401/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com