Avoid unnecessary iteration on action inputs. (#16462)

Closes #16118.

PiperOrigin-RevId: 468429355
Change-Id: I3b32a28ce3e7c6711fdc15839e5a88fad812184c

Co-authored-by: Chi Wang <chiwang@google.com>
diff --git a/src/main/java/com/google/devtools/build/lib/remote/RemoteExecutionCache.java b/src/main/java/com/google/devtools/build/lib/remote/RemoteExecutionCache.java
index 24c9385..c01ce30 100644
--- a/src/main/java/com/google/devtools/build/lib/remote/RemoteExecutionCache.java
+++ b/src/main/java/com/google/devtools/build/lib/remote/RemoteExecutionCache.java
@@ -28,6 +28,7 @@
 import com.google.common.base.Throwables;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
 import com.google.common.util.concurrent.ListenableFuture;
 import com.google.devtools.build.lib.profiler.Profiler;
 import com.google.devtools.build.lib.profiler.SilentCloseable;
@@ -82,13 +83,13 @@
       Map<Digest, Message> additionalInputs,
       boolean force)
       throws IOException, InterruptedException {
-    ImmutableSet<Digest> allDigests =
-        ImmutableSet.<Digest>builder()
-            .addAll(merkleTree.getAllDigests())
-            .addAll(additionalInputs.keySet())
-            .build();
+    Iterable<Digest> merkleTreeAllDigests;
+    try (SilentCloseable s = Profiler.instance().profile("merkleTree.getAllDigests()")) {
+      merkleTreeAllDigests = merkleTree.getAllDigests();
+    }
+    Iterable<Digest> allDigests = Iterables.concat(merkleTreeAllDigests, additionalInputs.keySet());
 
-    if (allDigests.isEmpty()) {
+    if (Iterables.isEmpty(allDigests)) {
       return;
     }