关于优化C#代码运行速度的几个问题

3
如果我有一个被频繁调用的方法,比如:
public int CalledManyTimes(int a, int b)
{
     MyObject myObject = new myObject();
     int c = a + b + myObject.GetSomeValue();

     return c;
}

MyObject myObject;放在方法之外,仅声明一次,是否会提高性能,还是编译器会自动执行这个操作?

结构体的传递方式是怎样的?

我正在将一个Point结构传递给一个方法(Point只包含int x和int y),该方法会修改这些值并返回一个new Point(newX, newY);。更好的做法是修改传入方法的Point并返回它吗?或者可以像我第一个问题中提出的那样,在方法之外创建一个Point point并使用它吗?


2
你是否测量并确定了你确实存在性能问题? - Mitch Wheat
1
你对代码进行过性能分析吗?你真的需要这些微小的优化吗? - L.B
我并没有什么性能问题,只是我写了一个方法,在程序的整个运行期间会被重复调用,我想知道像第一个例子中声明许多变量是否是一种不好的做法。 - NibblyPig
1
你说点是一个结构体,所以通常你会希望它是不可变的。 - Jason Down
我不知道答案,但为什么要依赖编译器而不是一开始就写出最好的代码呢?myObject在循环中似乎没有改变 - 所以在方法外部创建它一次就可以了。此外,如果你可以传递ref Point并修改它,那么就不需要额外的new Point开销了。即使只是2-3个周期,在实时应用中这可能会累加成很多。 - AVIDeveloper
1个回答

9

myObject 看起来没有有用的状态; 所以: 把它变成一个 static 方法 - 问题解决了; 没有分配,没有虚拟调用:

public int CalledManyTimes(int a, int b)
{
     int c = a + b + MyObject.GetSomeValue(); // static method

     return c;
}

对于其他问题:个人资料。

针对你的具体问题:

如果将MyObject myObject;放在方法外面,只声明一次,是否会提高性能,还是编译器会自动处理?

不初始化更快。但是,如果在问题中有一些状态不明显,那么我希望重用单个实例更有效率 - 但这会改变语义(在原始版本中,状态在迭代之间不共享)。

结构体是如何传递的?

默认情况下,它们在栈上被复制,只要您稍微看一眼它们。您可以使用ref来避免复制,这可能在结构体过于庞大或需要更新(最好重新分配而不是可变性)时很有用。


3
删掉 c 并没有真正的好处,因为编译器在优化的构建中可以很好地处理;但是如果保留 c ,通常更容易进行调试。 - Marc Gravell
垃圾回收不会重复使用对象,它总是会删除它?我猜如果我的方法每秒被调用50次,那么我应该尽可能将许多对象声明移到方法外面(如果需要,将它们设为静态)。至于结构体,我想相同的规则适用。对于结构体,该方法基本上是:这里有一个x坐标,请给我一个新的x坐标。我不能使用ref,因为我想要比较结果,所以是return new myStruct(x)而不是passedInStruct.X = xreturn passedInStruct; - NibblyPig
@SLC,每秒50次?在这种情况下,您几乎可以编写任何代码而不会产生可测量的影响。尝试并测量 - Stopwatch 对于大多数情况来说已经足够了。 - Alexei Levenkov
@SLC 不,对象永远不会自动重用;事实上,每秒50次根本算不了什么。 - Marc Gravell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接