0

如果我想清除很多对象上的特定布尔变量,并且这些对象之一应该在之后设置此变量,那么最有效的是:

  • 迭代所有对象并设置 var = false
  • 迭代所有对象,检查 var 并将其设置为 false 为 true
class Foo {
   boolean bar;  //false for most objects
}

然后使用:

for (Foo foo : fooList) {
   foo.setBar(false);
}

或者:

for (Foo foo : fooList) {
    if (foo.isBar()) {
       foo.setBar(false);
    }
}

然后设置一个 foo:

singleFoo.setBar(true);

对于这两种实现来说,节省的时间可能都很小。但是我无法测量那个atm,所以我很想知道你认为更好的方法是什么?

4

6 回答 6

5

我不确定编译器是否会将这两个示例调平。但是,如果这对您来说是性能瓶颈,我会感到非常惊讶。

只需使用这个:

for (Foo foo : fooList) {
   foo.setBar(false);
}

因为它更容易阅读

于 2013-03-04T16:22:55.907 回答
2

我不知道您要做什么,正如您所说,时间差异将很小,即无法检测到。,但答案很简单:仅更改值可能会“更快”,并且正如 coulls 所说,更易于阅读,因此您应该选择:

for (Foo foo : fooList) {
   foo.setBar(false);
}

稍微解释一下:

我假设您想计算其他程序的未来效率,所以我建议您计算最佳、最差和平均情况。在这种情况下,如果您必须更改所有布尔值或仅更改几个布尔值,您可以计算每个语句将花费多少时间。

例如,您可以说foo.setBar(false)需要A时间,而 if (foo.isBar())将需要B时间。

假设您只有 3 个foosfoolist您可以体验以下内容:

  • 最坏的情况:你必须改变bar所有 3 foos
  • 平均:有时最多需要更改 1 或 2 个柱。
  • 最佳情况:无需更改条形。

只做A你将有所有 3 个案例的总时间执行3A如果您使用if,它将需要:

  • 最坏情况: 3A + 3B
  • 平均: (1-2)A + 3B
  • 最佳案例: 3B

如果我们假设B < A,那么 if 选项只会在第三种情况下更快。如果B<<A那样的话,平均值会更好。但最坏的情况总是比只做作业更糟糕。在这种情况下,可能 A 和 B 将相似或相等,因此您将拥有 (A=B):

  • 最坏情况: 6A
  • 平均情况: (4-5) A
  • 最佳情况: 3A

因此,第一个选项(如开头所示)将是最好的。

这对于您面临的任何其他语言或性能问题都很有用。尽管如果您愿意,您可以查看官方Java 文档以检查是否有针对此的特殊 VM 改进。

于 2013-03-04T16:37:21.933 回答
1

将它们全部设置为 false,然后将单个设置为 true。有一篇很棒的关于分支预测的帖子我会找到的。

为什么处理排序数组比处理未排序数组更快?

如果您有大量对象,简单的 if 语句可能会成为一个巨大的瓶颈。很难说它有多重要,因为它取决于如果添加检查将设置多少个对象。

于 2013-03-04T16:22:53.060 回答
0

这是更好的方法

for (Foo foo : fooList) {
   foo.setBar(false);
}

因为它更清晰,并且您可以节省不编写和弄乱不清楚的代码的时间,例如,您可以花在使真正的慢代码运行得更快上。

于 2013-03-04T16:24:40.960 回答
0

最“有效”的方法是将它们全部设置为 false(您的第一个选项)。第二个需要两个方法调用,而不是一个。当然,效率上的差异几乎可以肯定是无关紧要的。如果有任何原因您可能想知道(或记录)在设置为假之前谁是假的,那么后一种方法显然是要走的路。

于 2013-03-04T16:26:45.497 回答
0

您正在谈论的是 JIT 编译器级别的优化。在编写代码时不应该考虑它们。在优化之前,先配置文件。并从最慢的地方开始优化,然后往下走。

于 2013-03-04T16:29:40.867 回答