0

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

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”在 50% 的时间内为真,那么哪些代码会运行得更快? 还有,哪个代码块更容易维护/阅读?

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

谢谢。

4

4 回答 4

1

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

于 2012-03-29T18:39:01.497 回答
1

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

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

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

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

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

于 2012-03-29T20:57:17.313 回答
0

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

于 2012-03-29T18:40:19.460 回答
0

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

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

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

于 2012-03-30T13:51:28.383 回答