2017-08-16 3 views
0

Ich las das "wann Parallelstrom zu verwenden?" von DougLea et.al http://gee.cs.oswego.edu/dl/html/StreamParallelGuidance.html.Leistung des sequentiellen Datenstroms

Ich fragte mich, ob jemand hatte eine Richtlinie (do/do not dos)/Beobachtungen, die sie fühlte, dass alte Art der Codierung in einigen Fällen besser als sequenzielle Stream ist? fand ich eine hier https://jaxenter.com/java-performance-tutorial-how-fast-are-the-java-8-streams-118830.html

Ich weiß, es ist eine abstrakte Frage, aber es wird hilfreich sein, wenn jemand ihre Erfahrung in der Leistung von Seq-Stream vs Java 7 way

Antwort

1

teilen kann ich dies nur ein paar Tage getan habe ; Wir hatten ein sehr großes Array zusammenzufassen und frage mich, was der schnellste Weg wäre, es zu tun - so gemessen I (nicht erraten, ich jmh benutzt habe):

@State(Scope.Thread) 
public static class Holder { 

    @Param({ "1000", "10000", "50000", "100000", "1000000" }) 
    public int howManyEntries; 

    int array[] = null; 

    @Setup 
    public void setUp() { 
     array = new int[howManyEntries]; 
     for (int i = 0; i < howManyEntries; ++i) { 
      array[i] = i; 
     } 
    } 

    @TearDown 
    public void tearDown() { 
     array = null; 
    } 
} 

@Fork(1) 
@Benchmark 
public int iterative(Holder holder) { 

    int total = 0; 
    for (int i = 0; i < holder.howManyEntries; ++i) { 
     total += holder.array[i]; 
    } 

    return total; 
} 

@Fork(1) 
@Benchmark 
public int stream(Holder holder) { 
    return Arrays.stream(holder.array).sum(); 
} 

@Fork(1) 
@Benchmark 
public int streamParallel(Holder holder) { 
    return Arrays.stream(holder.array).parallel().sum(); 
} 

Der Gewinner ist immer der alte Stil Java-7-Weg.

// 1000=[iterative, stream, streamParallel] 
// 10000=[iterative, stream, streamParallel] 
// 50000=[iterative, stream, streamParallel] 
// 100000=[iterative, stream, streamParallel] 
// 1000000=[iterative, stream, streamParallel] 

Sogar für 1 Million Elemente. Aber das Ergebnis unterscheidet sich in bis zu 60 ms - ob das beißt oder nicht, liegt ganz bei Ihnen.

Streams sind nicht für Geschwindigkeit gedacht, sie ersetzen nicht den alten Stil, sie wollen auch nicht - es könnte Ihrem Code zum Beispiel zusätzliche Sichtbarkeit geben.

+0

Danke für die Freigabe. Ich habe die Code-Lesbarkeit verstanden, die von Stream Way bereitgestellt wird. Jetzt, einige Tage, hatte ich die Tendenz, alles im Stream zu schreiben, aber bei einer Introspektion fand ich heraus, dass ich den alten Stil an einem Ort für bessere Performance verwenden sollte. Deshalb suche ich nach wirklichen Leben tun und tun nicht – nantitv

+1

@nantitv Ich bekomme Ihren Schmerz, um ehrlich zu sein; aber der Teil über Code, der besser lesbar ist, ist so groß geworden - ich habe es wirklich schwerer, Pre-Java-8 Code mit Streams zu lesen, dass selbst diese Millisekunden es nicht schaffen ... Das ist natürlich egal (der Geschwindigkeitsverlust), bis es geht - vielleicht ist das, was Sie "getroffen" haben mit ... – Eugene

Verwandte Themen