【问题标题】:Programming Principles: Assignement vs Conditions编程原则:赋值与条件
【发布时间】:2012-03-29 18:35:50
【问题描述】:

我做了一些研究,但找不到我正在寻找的答案,所以我想我会在这里解决这个问题。我想最好使用示例来演示它,因此请考虑以下 sn-ps 代码:

int delta = 0;
if (some_condition)
    delta = 42;

x1 = regular_value1 + delta;
x2 = regular_value2 + delta;
// ...
// where delta is used a lot of times
// basically - if (some_condition == true) => add delta to all variables
// if FALSE - add 0 (thus, effectively not changing anything)

对比

int delta = 42;

if (some_condition)
{
    x1 = regular_value1 + delta;
    x2 = regular_value2 + delta;
    // ...
}
else
{
    x1 = regular_value1;
    x2 = regular_value2;
    // ...
}

例如,一个非常简单的真实场景是:假设我正在创建一个窗口窗体,它可能在左侧包含一个图像,但可能不包含。如果没有图像 - 在左侧创建所有其余的表单控件,如果有图像,则将所有其他控件移到图像的右侧(将增量添加到每个控件的 X 位置)。

我正在编写一个 C# XNA 游戏(因此性能有些相关,但不应以任何方式省略 OOP 原则),因此我的问题是 - 如果“some_condition”为 TRUE 50,则哪些代码运行得更快% 的时间?还有,哪个代码块更容易维护/阅读?

我知道这不是一个大问题,但我只是想养成编写“最好”代码的习惯。任何意见甚至个人经验都将不胜感激。

谢谢。

【问题讨论】:

    标签: oop optimization readability principles


    【解决方案1】:

    后者可能会稍微快一些,或者它们可能都针对同一事物进行了优化。没关系,如果您发现它成为一个问题,您可以随时更改它(这种特殊情况肯定不会 - 这只是一般建议)。但至少我发现前者更容易阅读和维护。如果您想更改regular_value1regular_value2,您只需更改一处,而不是两处。去吧。

    【讨论】:

      【解决方案2】:

      这当然是一个微不足道的案例,两者都可能确实优化了相同的代码。我建议使用最容易理解的那个——这个决定应该基于比你在这里展示的更多的程序。

      但是第二种解决方案往往更快,特别是如果将“delta”变成一个常数。如果“some_condition”为假,则不需要进行任何添加,并且优化器可能会想出一些方法来加速实际分配,所以我看到那里的性能优势。我认为如果不损害可维护性,最好编写最快的代码。即使有比这更大的性能差异的东西,您实际上也永远不会在以后回来寻找加速它的方法。您现在也可以为性能编写代码并忘记它。随着时间的推移保持这一点,您的代码将免费运行得更快。

      也许有一天分析会指出这段代码是你程序中最慢的点。但很可能你——和其他人——只会接受代码以一定速度运行并相应地使用它的事实。永远不会想到它可以加速并在新的地方使用——比如在击键之间——而不会惹恼用户。

      这里的性能差异很小,而且代码可能永远不会在速度关键条件下使用,但我确实认为为速度而编码是个好主意。一旦你养成了这个习惯,实际上并不需要任何时间,而且你知道如果你的代码经过调整可以做什么,因为它已经调整并正在做。

      (根据我的经验,快速代码和可读代码大致相同。如果人类可以轻松理解代码,那么优化器也可以,而如今优化器为王。在极少数情况下我必须选择,除非我知道一切都取决于代码的快速性,否则我会追求清晰而不是速度。然后我疯狂地记录以赎罪。)

      【讨论】:

        【解决方案3】:

        这是一个有点主观的问题,但影响可读性(以及重要的可维护性)的因素之一是重复了多少代码。在这种情况下,第一个选项会导致需要维护和读取的代码更少(冗余更少),这将是我的首选方法

        【讨论】:

          【解决方案4】:

          正如@minitech 所指出的,第二种方法可以而且肯定会导致可维护性问题(思考要点:应用程序的生命周期有多长?您正在编写的代码是否正在运行?被其他人重用或消费?)和可读性。鉴于您已经考虑了这些因素,我建议您决定并设置一些应用程序应符合的性能数字。

          一旦明确了性能要求,您就可以决定采用哪种方法。 OOP 原则和可读性是每个程序员的梦想,但请记住,一旦您将应用程序交付给客户,您采用哪种方法并不重要,唯一重要的是您的应用程序按预期运行(从两者的角度来看)功能和性能)。

          您需要与利益相关者一起评估编写“最佳”代码的含义与“最佳”代码可能导致的实际性能影响。

          【讨论】:

            猜你喜欢
            • 2017-05-24
            • 1970-01-01
            • 2017-03-11
            • 1970-01-01
            • 2017-11-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多