从集合中提取信息——可读性还是性能?

Extracting information from a collection - readablility or performance?

有时需要从一个集合中提取多个信息。

但是这样做的最佳做法是什么?

可读性优于性能

是否应该为任何信息单独迭代集合?然后我们将有 n 次循环继续执行。

另一方面,这些方法很容易理解,因为很容易阅读从集合中提取的信息。

简单示例:

int max = determineMax(new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5, 6, 7)));
int sum = calculateSum(new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5, 6, 7)));
...
private int determineMax(ArrayList<Integer> integers) {
    int max = 0;
    for (Integer oneInteger : integers) {
        max = Math.max(max, oneInteger);
    }
    return max;
}

private int calculateSum(ArrayList<Integer> integers) {
    int sum = 0;
    for (Integer oneInteger : integers) {
        sum += oneInteger;
    }
    return sum;
}

性能优于可读性

另一种解决方案是循环一次,但随后需要return编辑许多变量。对于这种方法,我们需要使用数组或为 return 值创建人工 class。

简单示例:

int[] extractedInformation = extractInformation(new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5, 6, 7)));
...
private int[] extractInformation(ArrayList<Integer> integers) {
    int sum = 0;
    int max = 0;
    for (Integer oneInteger : integers) {
        sum += oneInteger;
        max = Math.max(max, oneInteger);
    }
    return new int[]{sum, max};
}

你可能渴望性能,但在现实世界中,项目如此之大,而且你不是唯一一个在做它的人。

我认为可读性和可维护性应该比性能更受重视。您提供的示例不遵循封装。

建议一个方法应该只做一件事,方法名应该反映这件事。

有时您可以不遵循它而追求性能,但只有在性能下降明显的情况下才可以。

而且通常只有当时间复杂度相差某个幂时才会有明显的差异,比如 O(n)、O(n2).

虽然第二个似乎确实运行得更快,但确实如此。但它们仍然被称为线性,因为 O(n) + O(n) 不等于 2*O(n).

总之,现在的电脑速度太快了。您不应该为了微小的性能提升而放弃可读性和可维护性。

而你的例子是一个极端的例子。大多数时候你不会遇到这种事情。想想你是只需要 sum 还是只需要 max。您将定义另外两个方法,否则当您要求一个方法时您将得到两个东西,这对性能也不利。

这也取决于您大多数时候要做什么。

我同意

此外,如果这些信息提取方法如此频繁,为这个用例写一个class可能是可行的。它可以在 adding/removing 上将此信息处理到运行时的包含集合中,或者处理给定的集合。

如果您的示例不那么笼统并且确实包含数字,则有统计数据 classes 涵盖总和、最大值、平均值、标准差等。