【问题标题】:Is this a good practice to avoid constant object creation?这是避免不断创建对象的好习惯吗?
【发布时间】:2011-07-13 23:06:10
【问题描述】:

早上好,

假设我有一个类ClassA,一个运算符+,它总结了两个ClassA 类型的对象,一个从intClassA 的隐式转换,并且我想重载运算符@987654329 @...假设+ 的代码相当长,但ClassA1 的总和是一个非常特殊的情况,哪个选项更好?

  1. 使用+ 实现++ 和已定义的隐式转换。
  2. 重复部分代码,这在仅添加1 时会大大简化。

我的想法是(2)更好,因为它通过隐式转换保存了新 ClassA 对象的创建,如果使用 ++ 运算符,这可能非常有用,例如,在 @987654338 @ 循环。此外,速度是必须的。

非常感谢。

【问题讨论】:

  • 你有什么反对打招呼的吗?为什么要编辑帖子以将其删除?我没有问你...
  • 不是我个人同意删除称呼,但我认为这样做是因为this
  • @Miguel:这里的政策通常是反对打招呼的。感觉是它们只是多余的“噪音”,并没有为帖子添加任何特定的价值。它们通常被具有编辑权限的人删除。如果这种情况发生在你身上,你不应该把它当作一种侮辱。你可以阅读我们不久前关于它的讨论here on the Meta site
  • 请停止编辑称呼。如果 OP 想要,应该留下:meta.stackexchange.com/questions/2950/…
  • 一般来说,是的,但我们都是人类,跳过它需要额外的半秒。如果提问者觉得这很重要,那么这里保留一点人为因素就可以了。

标签: c# .net performance operators operator-overloading


【解决方案1】:

您已经回答了自己的问题。如果速度是必须的,那么选择第二个更快的选项(最好对其进行基准测试以确保它确实明显更快)。

否则,请使用第一个选项,因为代码越少越好(并且保持 DRY 双倍如此)。更少的代码意味着更少的潜在错误、更少的维护、更少的编写和更少的阅读。如果代码在很大程度上重复了另一部分代码,那么您必须在进行更改时使两者保持同步——这会带来麻烦,因为很容易忘记更新一个(即使您总是记得对这两个地方进行更改,因为它们并不完全相同,因此可以正确更新一个部分并错误地更新另一个部分)。

在做出最终决定之前确保速度确实是必须的——你不想要premature optimization

【讨论】:

    【解决方案2】:

    任何一种方式都可以接受。听起来第二种方式是你已经倾向于的方式,所以试试吧。事实上,尝试两种方法并测量增加一百万次所需的时间。基准测试始终是做出这些决定的方式。

    如果您之前没有做过任何基准测试,最简单的方法是创建一个System.Diagnostics.Stopwatch 并围绕相关代码启动/停止它。然后,您可以将经过的时间写入控制台。

    【讨论】:

      【解决方案3】:

      我的观点是,如果 +1 是一个更简单的真正特殊情况,请执行特殊的 ++ 实现。如果您想保持代码较小,您可以随时将其注释掉并将其引用到 + 1。

      否则,太容易忘记这个特殊的优化 6 个月。当您尝试优化时。

      过早的优化是指您知道如何优化之前,而不是在您有明确的理由这样做时进行优化。然而,如何划清界限是困难的。您需要确定 ++ 代码有多简单 才能考虑将其放入。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-21
        • 1970-01-01
        • 2016-06-27
        • 1970-01-01
        • 1970-01-01
        • 2020-11-06
        相关资源
        最近更新 更多