changeset 8097:15e1cce39200

Optimize setting of combined op flags on head stream.
author psandoz
date Fri, 12 Apr 2013 17:22:49 +0200
parents 6550cf4d25bd
children 689cf91b8f81
files src/share/classes/java/util/stream/AbstractPipeline.java test-ng/boottests/java/util/stream/StreamOpFlagsTest.java
diffstat 2 files changed, 24 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/src/share/classes/java/util/stream/AbstractPipeline.java	Fri Apr 12 10:33:57 2013 -0400
+++ b/src/share/classes/java/util/stream/AbstractPipeline.java	Fri Apr 12 17:22:49 2013 +0200
@@ -134,7 +134,9 @@
         this.sourceSupplier = source;
         this.sourceStage = this;
         this.sourceOrOpFlags = sourceFlags & StreamOpFlag.STREAM_MASK;
-        this.combinedFlags = StreamOpFlag.combineOpFlags(sourceOrOpFlags, StreamOpFlag.INITIAL_OPS_VALUE);
+        // The following is an optimization of:
+        // StreamOpFlag.combineOpFlags(sourceOrOpFlags, StreamOpFlag.INITIAL_OPS_VALUE);
+        this.combinedFlags = (~(sourceOrOpFlags << 1)) & StreamOpFlag.INITIAL_OPS_VALUE;
         this.depth = 0;
         this.parallel = parallel;
     }
@@ -152,7 +154,9 @@
         this.sourceSpliterator = source;
         this.sourceStage = this;
         this.sourceOrOpFlags = sourceFlags & StreamOpFlag.STREAM_MASK;
-        this.combinedFlags = StreamOpFlag.combineOpFlags(sourceOrOpFlags, StreamOpFlag.INITIAL_OPS_VALUE);
+        // The following is an optimization of:
+        // StreamOpFlag.combineOpFlags(sourceOrOpFlags, StreamOpFlag.INITIAL_OPS_VALUE);
+        this.combinedFlags = (~(sourceOrOpFlags << 1)) & StreamOpFlag.INITIAL_OPS_VALUE;
         this.depth = 0;
         this.parallel = parallel;
     }
--- a/test-ng/boottests/java/util/stream/StreamOpFlagsTest.java	Fri Apr 12 10:33:57 2013 -0400
+++ b/test-ng/boottests/java/util/stream/StreamOpFlagsTest.java	Fri Apr 12 17:22:49 2013 +0200
@@ -26,8 +26,10 @@
 
 import org.testng.annotations.Test;
 
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Comparator;
+import java.util.EnumSet;
 import java.util.List;
 import java.util.Spliterator;
 import java.util.function.Consumer;
@@ -38,6 +40,7 @@
 
 import static java.util.stream.StreamOpFlag.*;
 import static org.testng.Assert.*;
+import static org.testng.Assert.assertEquals;
 
 @Test
 public class StreamOpFlagsTest {
@@ -48,6 +51,21 @@
         assertEquals(sourceFlags, toStreamFlags(combineOpFlags(sourceFlags, StreamOpFlag.INITIAL_OPS_VALUE)));
     }
 
+    public void testInitialOpFlagsFromSourceFlags() {
+        List<StreamOpFlag> flags = new ArrayList<>(StreamOpFlagTestHelper.allStreamFlags());
+        for (int i = 0; i < (1 << flags.size()); i++)  {
+            int sourceFlags = 0;
+            for (int f = 0; f < flags.size(); f++) {
+                if ((i & (1 << f)) != 0)  {
+                    sourceFlags |= flags.get(f).set();
+                }
+            }
+
+            int opsFlags = combineOpFlags(sourceFlags, StreamOpFlag.INITIAL_OPS_VALUE);
+            assertEquals(opsFlags, (~(sourceFlags << 1)) & StreamOpFlag.INITIAL_OPS_VALUE);
+        }
+    }
+
     public void testSameCombine() {
         for (StreamOpFlag f : StreamOpFlagTestHelper.allStreamFlags()) {
             int sourceFlags = f.set();