【发布时间】:2015-12-22 23:57:23
【问题描述】:
这是一些代码。
public void blur(final int x, final int y, final int w, final int h) {
final Picture p = new Picture(this);
IntStream.range(x, x + w).parallel().forEach(i
-> IntStream.range(Y, Y + h).forEach(j
-> {
final Pixel pixel = this.getPixel(i, j);
final java.util.List<Pixel> others
= Arrays.asList(
p.getPixel(i - 1, j),
p.getPixel(i, j - 1),
p.getPixel(i, j + 1),
p.getPixel(i + 1, j),
p.getPixel(i - 1, j - 1),
p.getPixel(i + 1, j + 1),
p.getPixel(i - 1, j + 1),
p.getPixel(i + 1, j - 1),
pixel
);
pixel.setBlue((int) (others.stream()
.mapToInt(Pixel::getBlue).average().getAsDouble()));
pixel.setRed((int) (others.stream()
.mapToInt(Pixel::getRed).average().getAsDouble()));
pixel.setGreen((int) (others.stream()
.mapToInt(Pixel::getGreen).average().getAsDouble()));
})
);
}
某些语言为一系列整数提供并行 for 循环。 Java 似乎没有,但我不喜欢以“正确的方式”处理多线程(比如 fork-join 等)
这样有效吗?我发现这确实比标准的for (int i ... 代码快。我应该并行哪个循环(流)?这是一种好的编码习惯吗?
【问题讨论】:
-
另外一个问题,这会是过早的优化吗?如果它需要 2 秒而不是 1 秒并不重要,为什么要以清晰为代价让它快速运行呢?
-
@Bartvbl 不。这是 10 秒而不是 100 秒的问题。此外,我真的不觉得它为时过早本身。
-
哇,是的。这绝对值得。别管我:)
-
我倾向于说你应该坚持使用常规的 for 循环而不是新的流方法,因为它只会增加混乱。现在我确实意识到您的目标是(并行)效率,所以我建议您为此使用 fork-join 框架,因为目前它看起来很混乱。
-
这看起来与您想要实现的完全一样:docs.oracle.com/javase/tutorial/essential/concurrency/…(至少是一个很好的起点)
标签: java multithreading optimization java-stream