diff --git a/src/backend/executor/instrument.c b/src/backend/executor/instrument.c
index fe5d55904d27f2f2bc5f77b013d5c52a32d5b5d2..0f2da2214831eb5f6feef06fd1524717181f3fb9 100644
--- a/src/backend/executor/instrument.c
+++ b/src/backend/executor/instrument.c
@@ -62,13 +62,9 @@ InstrInit(Instrumentation *instr, int instrument_options)
 void
 InstrStartNode(Instrumentation *instr)
 {
-	if (instr->need_timer)
-	{
-		if (INSTR_TIME_IS_ZERO(instr->starttime))
-			INSTR_TIME_SET_CURRENT(instr->starttime);
-		else
-			elog(ERROR, "InstrStartNode called twice in a row");
-	}
+	if (instr->need_timer &&
+		INSTR_TIME_SET_CURRENT_LAZY(instr->starttime))
+		elog(ERROR, "InstrStartNode called twice in a row");
 
 	/* save buffer usage totals at node entry, if needed */
 	if (instr->need_bufusage)
diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h
index f968444671cb97fab95b20cbcebbe308e3507470..60984905b25af38ff15fc42723c97334dabc827c 100644
--- a/src/include/portability/instr_time.h
+++ b/src/include/portability/instr_time.h
@@ -20,6 +20,9 @@
  *
  * INSTR_TIME_SET_CURRENT(t)		set t to current time
  *
+ * INSTR_TIME_SET_CURRENT_LAZY(t)	set t to current time if t is zero,
+ *									evaluates to whether t changed
+ *
  * INSTR_TIME_ADD(x, y)				x += y
  *
  * INSTR_TIME_SUBTRACT(x, y)		x -= y
@@ -245,4 +248,9 @@ GetTimerFrequency(void)
 
 #endif							/* WIN32 */
 
+/* same macro on all platforms */
+
+#define INSTR_TIME_SET_CURRENT_LAZY(t) \
+	(INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false)
+
 #endif							/* INSTR_TIME_H */