假设我经常在代码中调用Print。
我必须将CurrentPosition声明为全局变量还是局部变量?
我想知道哪个版本更快。
选项A:
int CurrentPosition = 0;
void Print(string key, int conc, int col, byte _color) {
if (col <= cMax ? col >= cMin : false) {
if (CurrentRows.TryGetValue(key + "#" + conc.ToString(), out CurrentPosition)) { //Row is in the vieport
grid.GetCell(CurrentPosition, col).Presenter.Background = new SolidColorBrush(Color.FromRgb(255, 255, 0));
}
}
}选项B:
void Print(string key, int conc, int col, byte _color) {
int CurrentPosition = 0;
if (col <= cMax ? col >= cMin : false) {
if (CurrentRows.TryGetValue(key + "#" + conc.ToString(), out CurrentPosition)) { //Row is in the vieport
grid.GetCell(CurrentPosition, col).Presenter.Background = new SolidColorBrush(Color.FromRgb(255, 255, 0));
}
}
}发布于 2014-05-11 20:56:13
我建议深入了解一下C#编译器是如何处理这两个选项的。
假设我有一个简单的类:
class Test
{
private int _currentPosition;
public int OptionA()
{
ImplOutParameter(out _currentPosition);
return _currentPosition;
}
public int OptionB()
{
int currentPosition;
ImplOutParameter(out currentPosition);
return currentPosition;
}
public void ImplOutParameter(out int position)
{
position = 1;
}
}前两种方法非常类似于你的方法。第三种是在这里测试out参数实现。
让我们在发行版配置中编译这个类。使用您最喜欢的IL查看器,OptionA方法如下所示:

它将对象的引用推到堆栈上两次,以获得变量成员引用并调用ImplOutParameter方法。然后返回变量成员的值。
OptionB方法如下所示:

它在堆栈上推送对象的引用,在堆栈上推送变量的地址,并调用它返回的值的ImplOutParameter method.Then。不需要花费时间来分配变量。
基于这一分析,我倾向于说OptionB实现比第一个要快一些,但是这是非常小的。:)
发布于 2014-05-11 15:48:42
如果在调用之间维护CurrentPosition的状态,并且没有将值传递给方法,那么它就需要在外部。否则,每次都会重新开始。
但是,最好的策略是将CurrentPosition作为参数传递到方法中,并保持状态独立于例程的代码。
就速度而言,分配确实需要少量的时间,但通常是可以忽略不计的。不管如何,“堆栈框架”都会被加长,而分配默认值则需要与赋值一样长的时间。
因此,您将节省的最多的是每次调用的几个周期(即纳秒),但是是的,在外面声明它的速度会更快。
发布于 2014-05-11 16:12:08
如果你想知道哪个更快,就试一试。只有这样才能确定。
如果您正在决定在此基础上选择哪种方法,请始终测试性能。如果它不值得测试,那么您就不需要额外的周期。
尽管如此,这两种方法在功能上/我是不同的,所以您的决定不应该基于它们的速度。选项B每次调用Print时都会设置CurrentPosition,而选项A则将CurrentPosition设置为0一次,调用打印时其值不能保证为0/i,因此您应该选择提供正确函数的选项。
我可以告诉你,速度不同很可能是可以忽略的,实际上两者之间根本不存在。
https://stackoverflow.com/questions/23594610
复制相似问题