【问题标题】:Global variable vs local variable assignment in terms of efficiency就效率而言,全局变量与局部变量赋值
【发布时间】:2014-09-16 21:21:13
【问题描述】:

假设下面代码中的m_eligibleCustomers对效率有相当大的影响,哪种方式在效率方面更好。

在创建对象时全局声明它并为变量赋值,并让它一直保持到对象超出范围。或者只在方法内部赋值,(假设20个方法中有3个方法需要它),不是所有的方法都可能被调用,可能属于不同的事件代码,这样方法一用完就释放内存范围。

我个人喜欢在全局范围内进行,在第一次使用时赋值并重用,但如果对象相当大,那是一个正确的决定吗?更多我认为,我觉得在一个方法范围内声明似乎是一个好主意。在上述情况下选择什么是更好的选择?

   internal class Program
   {
    private DataSet m_CustomerSet;
    private IEnumerable<Customer> m_eligibleCustomers;

    public Program()
    {
        m_CustomerSet = GetDataSetFromCache();
        m_eligibleCustomers = GetEligibleCustomers(customerSet);
    }

    private void OnClick(object sender, EventArgs e)
    {
        MethodA(eligibleCustomers); //OR MethodA(customerSet) and do calculation with in the method 
        //and object is destroyed as soon as the method is completed
        MethodB();
        MethodC();
        MethodD();
        MethodE();
        MethodF();
        MethodG(eligibleCustomers);
        MethodH();
    }
}

【问题讨论】:

  • 没有。完全在这里考虑“效率”(就本地变量与“全局”变量而言)。回到起点。编写干净的代码。谢谢,祝你有美好的一天!
  • 即使是清洁工方面,您认为哪一个更具可读性?如果遵循正确的命名约定并正确命名变量,我可以看到它们都是同样干净的代码。在可重用性方面,肯定首选全局方式。这一次,您能否考虑一下您必须考虑性能?
  • (我并不是要暗示保留大约几十个代表相同数据的额外对象是合适的,特别是对于较大的对象或缓慢的重建方法,而是说这个生命周期 i> 管理不是使用局部变量和成员变量之间的选择:它是关于生命周期的,但是它们是被维护的。变量有助于这些对象如何保持可访问/访问,但是在成员变量中传递对象没有问题, 或当前作用域中的变量,作为局部变量等使用的函数)
  • (至于何时保留共享/缓存数据是合适的 - 和/或如何注入/创建、安全修改和适当处理(如果相关) - 没有一个答案。我的一般建议是最小化此类的有效范围,并尽可能避免依赖对象的状态,这也有利于将对象作为参数提供给内部方法并编写“纯”函数。)
  • 如果可能不需要数据,您可能需要考虑延迟初始化

标签: c# .net performance oop


【解决方案1】:

是的,让它保持全局,因为你每次都需要调用 DB,但是 gobal 变量是老派的,使用缓存来存储这些对象,特别是如果它是 Web 应用程序,那么你可以设置过期日期等

【讨论】:

  • 在我的场景中,我会从缓存中读取,然后执行操作。
【解决方案2】:

如果您想提高效率,请选择 C ​​或汇编程序。否则有效地编写你的算法。在最坏的情况下放弃递归并用(可能更复杂的)循环替换它 - 但永远不要微优化这些东西。

以简洁的方式编写代码,以便您能够在一年内理解它,这比任何解决方案可能会快 0,0001% 所获得的任何性能表现都更有价值。

【讨论】:

  • "如果你想提高效率,就去获取 C 或汇编程序。"如果您的项目已经在特定域上运行多年怎么办?遵循适当的命名约定并适当命名方法/变量,我可以看到代码是干净且易于理解的。
  • 如果您真的相信它会做出改变 - 继续,对它进行基准测试。我已经优化了 C# 代码。通常我必须优化我的同事算法或确保他们使用正确的类型来完成正确的任务。这将性能提高了几个百分点。 (我已经在上面提到过) - 我从来没有时间优化这些事情 - 这就是为什么我的建议,和其他人一样 - 不要这样做,你不会从中得到任何东西
  • 谢谢。我喜欢你在评论中所说的话,而不是在你的回答中。赞赏。
猜你喜欢
  • 1970-01-01
  • 2020-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多