首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >变量函数优化

变量函数优化
EN

Stack Overflow用户
提问于 2014-05-11 15:42:58
回答 3查看 98关注 0票数 1

假设我经常在代码中调用Print

我必须将CurrentPosition声明为全局变量还是局部变量?

我想知道哪个版本更快。

选项A:

代码语言:javascript
复制
    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:

代码语言:javascript
复制
    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));
            }
        }
    }
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-05-11 20:56:13

我建议深入了解一下C#编译器是如何处理这两个选项的。

假设我有一个简单的类:

代码语言:javascript
复制
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实现比第一个要快一些,但是这是非常小的。:)

票数 1
EN

Stack Overflow用户

发布于 2014-05-11 15:48:42

如果在调用之间维护CurrentPosition的状态,并且没有将值传递给方法,那么它就需要在外部。否则,每次都会重新开始。

但是,最好的策略是将CurrentPosition作为参数传递到方法中,并保持状态独立于例程的代码。

就速度而言,分配确实需要少量的时间,但通常是可以忽略不计的。不管如何,“堆栈框架”都会被加长,而分配默认值则需要与赋值一样长的时间。

因此,您将节省的最多的是每次调用的几个周期(即纳秒),但是是的,在外面声明它的速度会更快。

票数 1
EN

Stack Overflow用户

发布于 2014-05-11 16:12:08

如果你想知道哪个更快,就试一试。只有这样才能确定。

如果您正在决定在此基础上选择哪种方法,请始终测试性能。如果它不值得测试,那么您就不需要额外的周期。

尽管如此,这两种方法在功能上/我是不同的,所以您的决定不应该基于它们的速度。选项B每次调用Print时都会设置CurrentPosition,而选项A则将CurrentPosition设置为0一次,调用打印时其值不能保证为0/i,因此您应该选择提供正确函数的选项。

我可以告诉你,速度不同很可能是可以忽略的,实际上两者之间根本不存在。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23594610

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档