代码之家  ›  专栏  ›  技术社区  ›  SpoiledTechie.com

局部变量和从方法调用的变量之间的区别?C.*

  •  1
  • SpoiledTechie.com  · 技术社区  · 16 年前

    我想知道什么更快。帮帮我。

    我在这样的方法中声明了一个变量:

        public static Regex FindNumber()
    { return new Regex(@"\d+", RegexOptions.IgnoreCase | RegexOptions.Compiled); }
    

    如您所见,它返回一个正则表达式。

    我还有另一种方法,看起来是这样的:

        private static string TestOne(string RawData)
    {
        Regex rgxFindNumber = FindNumber();
        Regex rgxFindDays = FindDays();
        for (int i = 0; i < mc.Count; i++)
        {
            int days = Convert.ToInt32(rgxFindNumber.Match(rgxFindDays.Match(mc[i].Value).Value).Value);
        }
        return RawData;
    }
    

    现在testone方法会更快还是test2?

            private static string TestTwo(string RawData)
    {
        for (int i = 0; i < mc.Count; i++)
        {
            int days = Convert.ToInt32(FindNumber().Match( FindDays().Match(mc[i].Value).Value).Value);
        }
        return RawData;
    }
    

    现在我很好奇,因为testone在我的代码中可以被称为一个非常好的代码,所以我想知道什么是更好的实现。

    谢谢大家。

    **编辑:**我使用的代码有一个非常大的类。它是一个基于文本的策略游戏的文本解析器。我正在尝试重构它,这就是我在这里想知道的。如果我为regex创建了一个私有变量,那么它不是每次访问类时都会运行吗?这是我的问题。

    3 回复  |  直到 16 年前
        1
  •  4
  •   Lasse V. Karlsen    16 年前

    TestOne 会比 TestTwo 因为您没有为每个循环迭代创建新的正则表达式。

    这有两个好处:

    • 用于解析和构造regex对象的时间只完成一次,而不是 mc.Count 时代
    • 由于构造的对象更少,因此对垃圾收集的压力更小。

    不过,我会更进一步。如果您总是要返回相同的正则表达式,并且您关心速度,那么我将在静态字段中缓存该regex对象。

    例如,您可以考虑:

    private static Regex _FindNumber;
    public static Regex FindNumber()
    {
        if (_FindNumber == null)
            _FindNumber = new Regex(@"\d+", RegexOptions.IgnoreCase | RegexOptions.Compiled);
        return _FindNumber;
    }
    

    这将只创建一个对象,总计,并保留它。

    然而,这是我真正的答案。

    为了真正知道哪一个最快,您必须测量您的代码,可以选择使用我的变量进行良好的测量,然后决定。永远不要在没有硬数据的情况下决定优化,否则最终可能会花费时间重写代码,这可能会引入新的bug,而这些bug需要修复,而您将花费更多的时间在代码上,只会使性能再提高1%。

    大的优化是通过算法来完成的,比如改变排序算法的类型,然后只有在必要的时候,才能继续进行局部优化,比如循环优化。

    尽管如此,我至少要避免在循环中构造对象,这是常识。

        2
  •  1
  •   Jon    16 年前

    我相信 TestOne 会更快,因为在 TestTwo 您正在创建新的 Regex 对象每次循环。如果 FindDays 实现方式与 FindNumber 这会更糟,因为您将创建两个对象。

        3
  •  1
  •   womp    16 年前

    从技术上讲,testone将更快,因为testwo通过调用findnumber()添加堆栈帧。

    我不知道这会有多大的区别,我怀疑这有多大。您的方法是静态的,所以实际上它只是创建对象,应该非常快。

    我的问题是,为什么要使用函数调用反复返回相同的字符串?为什么不声明一个实变量呢?

    像,

    private static Regex _findNumber = new Regex(@"\d+", RegexOptions.IgnoreCase | RegexOptions.Compiled);