【问题标题】:Create variable or call method few times - What's better?多次创建变量或调用方法 - 什么更好?
【发布时间】:2015-04-24 17:23:10
【问题描述】:

我想知道创建新变量或调用方法几次。 什么对整体性能和 GC 清洗更好? 看看:

public static string GetValue(RegistryKey key, string value)
{
    if (key.GetValue(value) == null)
        return null;
    string newValue = key.GetValue(value).ToString();
    if (String.IsNullOrWhiteSpace(newValue))
        return null;
    return newValue.ToLower();
}

我怎样才能使这段代码清晰?

【问题讨论】:

  • 很可能两者都不是。你永远无法知道编译器会做什么来优化你的代码。
  • StackOverflow 是关于特定编程问题的。如果您想谈论代码质量,请前往Code Review。请在发布之前查看他们的 How-to-Ask 页面(您应该在此处完成)。
  • 我猜,这是不必要的过早优化。在大多数情况下,您应该使用分析器来查找瓶颈并对其进行优化。
  • 这不是过早优化的情况。如果RegistryKey.GetValue 方法不缓存其结果,则此调用将需要注册表访问,这比访问局部变量要慢几个数量级

标签: c# variables methods garbage-collection


【解决方案1】:

一般来说,当你需要多次使用一个方法调用的结果时,你应该先把它赋给一个局部变量。局部变量只需要你方法的堆栈帧大几个字节(64 位对象变量为 8 个字节),并且会在方法返回时自动清除——它对 GC 没有影响。

另一方面,重复的方法调用将需要再次执行其所有逻辑,从而导致分配所需的堆栈帧并可能实例化对象。在您的情况下,RegistryKey.GetValue 使情况变得更糟,因为它需要访问 Windows 注册表,使其比本地变量访问慢几个数量级。此外,您可能会面临两个调用返回不同值的竞争条件。

public static string GetValue(RegistryKey key, string name)
{
    object value = key.GetValue(name);
    if (value == null)
        return null;
    string valueStr = value.ToString()
    if (String.IsNullOrWhiteSpace(valueStr))
        return null;
    return valueStr.ToLower();
}

请注意,此问题将在 C# 6 中得到很大解决,您可以在其中使用空条件运算符:

public static string GetValue(RegistryKey key, string name)
{
    string value = key.GetValue(name)?.ToString();
    if (String.IsNullOrWhiteSpace(value))
        return null;
    return value.ToLower();
}

【讨论】:

  • 哇,C# 6 简直是小菜一碟!我认为 '?'如果需要,会返回空字符串值吗?
  • 如果anulla?.Foo() 将立即计算为null。如果a 不是null,它将调用a.Foo()(并返回其结果)。
【解决方案2】:

创建一个局部变量并调用该方法一次。本地方法调用有(诚然很小的)开销。如果您使用远程方法调用,则差异会更加明显。

【讨论】:

    【解决方案3】:

    使用 ?运算符使其更具可读性 如您所见,性能也更好

    public static string GetValue(RegistryKey key, string value)
    {
        string valueStr=(string)key.GetValue(value);
        return string.IsNullOrWhiteSpace(valueStr)?null:valueStr.ToLower();
    }
    

    【讨论】:

    • 为什么你认为三元运算符的性能更好?
    • 没有。我的意思是直接转换为字符串的性能更好...与 OP 代码相比,如果 else 更少。我不认为使用 if else 或?对性能影响很大。@YuvalItzchakov
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-18
    • 1970-01-01
    • 2012-10-04
    • 2018-11-23
    • 1970-01-01
    • 2011-03-23
    • 2017-03-23
    相关资源
    最近更新 更多