Java8 akarsu sıralı ve paralel yürütme farklı sonuçlar?
Java8 aşağıdaki akış örnek çalışma:
System.out.println(Stream
.of("a", "b", "c", "d", "e", "f")
.reduce("", (s1, s2) -> s1 "/" s2)
);
verim:
/a/b/c/d/e/f
- Elbette - hiçbir sürpriz. http://docs.oracle.com/javase/8/docs/api/index.html?overview-summary.html nedeniyle akışı sırayla veya paralel yürütülen olup olmadığı önemli olmamalı:
Hesaplama sonucu değiştirmemelidir paralel bir akış sırayla yürütür ya. işlemleri açıkça belirli olmayan olarak tanımlanan, findAny gibi hariç),
AFAIK reduce()
deterministik ve (s1, s2) -> s1 "/" s2
parallel()
ekleyerek aynı sonucu verecektir böylece ilişkilendirilebilir.:
System.out.println(Stream
.of("a", "b", "c", "d", "e", "f")
.parallel()
.reduce("", (s1, s2) -> s1 "/" s2)
);
Ancak benim makinede sonucudur:
/a//b//c//d//e//f
Burada yanlış olan ne?
BTW: kullanarak (tercih edilen) .collect(Collectors.joining("/"))
reduce(...)
verimleri yerine, aynı sonucu sıralı ve paralel yürütme için a/b/c/d/e/f
.
JVM ayrıntılar:
java.specification.version: 1.8
java.version: 1.8.0_31
java.vm.version: 25.31-b07
java.runtime.version: 1.8.0_31-b13
CEVAP
Azaltmak gelen belgeleri:
Kimlik değeri akümülatör fonksiyon için bir kimlik gerekir. Bu t için, akümülatör anlamına gelir.geçerli(kimlik) t t eşittir.
Hangi durumda doğru değil - "" ve "" bir"/". oluşturur
Akü işlevi sürükleyin ve bir çıktının ne olacağını göstermek için eklendi
BinaryOperator<String> accumulator = (s1, s2) -> {
System.out.println("joining \"" s1 "\" and \"" s2 "\"");
return s1 "/" s2;
};
System.out.println(Stream
.of("a", "b", "c", "d", "e", "f")
.parallel()
.reduce("", accumulator)
);
Bu örnek çıktı (çalışan arasında farklıdır):
joining "" and "d"
joining "" and "f"
joining "" and "b"
joining "" and "a"
joining "" and "c"
joining "" and "e"
joining "/b" and "/c"
joining "/e" and "/f"
joining "/a" and "/b//c"
joining "/d" and "/e//f"
joining "/a//b//c" and "/d//e//f"
/a//b//c//d//e//f
İşlev için if ifadesi boş bir dize ayrı: işlemek için ekleyebilirsiniz
System.out.println(Stream
.of("a", "b", "c", "d", "e", "f")
.parallel()
.reduce((s1, s2) -> s1.isEmpty()? s2 : s1 "/" s2)
);
Marko Topolnik fark olarak, s2
akü olarak gerekli değildir kontrol değişmeli işlevi olmak zorunda değil.
Farklı sonuçlar farklı tarayıcılarda a...
Neden bu iki karşılaştırmalarda farklı...
Oldukça basit bir c derlerken gcc ve t...
Java ile farklı sonuçlar's digest...
Node.js Koordinatör paralel yürütme...