diff --git a/src/backend/storage/ipc/standby.c b/src/backend/storage/ipc/standby.c
index 4f209ea..5bcde05 100644
--- a/src/backend/storage/ipc/standby.c
+++ b/src/backend/storage/ipc/standby.c
@@ -193,10 +193,16 @@ ResolveRecoveryConflictWithVirtualXIDs(VirtualTransactionId *waitlist,
 	TimestampTz waitStart;
 	char	   *new_status;
 
+	/* Return immediately if list is empty, to avoid extra work. */
+	if (!VirtualTransactionIdIsValid(*waitlist))
+		return;
+
+	/* At least one conflict, so do initialization. */
 	waitStart = GetCurrentTimestamp();
 	new_status = NULL;		/* we haven't changed the ps display */
 
-	while (VirtualTransactionIdIsValid(*waitlist))
+	/* Loop test at bottom, since we already checked it the first time. */
+	do
 	{
 		/* reset standbyWait_us for each xact we wait for */
 		standbyWait_us = STANDBY_INITIAL_WAIT_US;
@@ -245,7 +251,7 @@ ResolveRecoveryConflictWithVirtualXIDs(VirtualTransactionId *waitlist,
 
 		/* The virtual transaction is gone now, wait for the next one */
 		waitlist++;
-	}
+	} while (VirtualTransactionIdIsValid(*waitlist));
 
 	/* Reset ps display if we changed it */
 	if (new_status)
