v1_avoid_unnecessary_code_execution_in_instrumentation.patch

text/plain

Filename: v1_avoid_unnecessary_code_execution_in_instrumentation.patch
Type: text/plain
Part: 0
Message: [PATCH] Avoid unnecessary code execution in Instrument.c when TIMING is FALSE

Patch

Same data as JSON: GET /api/v1/attachments/:id/patch the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes. API reference →
Format: unified
Series: patch v1
File+
src/backend/executor/instrument.c 25 13
diff --git a/src/backend/executor/instrument.c b/src/backend/executor/instrument.c
index 56e635f4700..e4274a28525 100644
--- a/src/backend/executor/instrument.c
+++ b/src/backend/executor/instrument.c
@@ -114,7 +114,8 @@ InstrStopNode(Instrumentation *instr, double nTuples)
 	if (!instr->running)
 	{
 		instr->running = true;
-		instr->firsttuple = INSTR_TIME_GET_DOUBLE(instr->counter);
+		if (instr->need_timer)
+			instr->firsttuple = INSTR_TIME_GET_DOUBLE(instr->counter);
 	}
 	else
 	{
@@ -122,7 +123,7 @@ InstrStopNode(Instrumentation *instr, double nTuples)
 		 * In async mode, if the plan node hadn't emitted any tuples before,
 		 * this might be the first tuple
 		 */
-		if (instr->async_mode && save_tuplecount < 1.0)
+		if (instr->need_timer && instr->async_mode && save_tuplecount < 1.0)
 			instr->firsttuple = INSTR_TIME_GET_DOUBLE(instr->counter);
 	}
 }
@@ -149,18 +150,24 @@ InstrEndLoop(Instrumentation *instr)
 		elog(ERROR, "InstrEndLoop called on running node");
 
 	/* Accumulate per-cycle statistics into totals */
-	totaltime = INSTR_TIME_GET_DOUBLE(instr->counter);
+	if (instr->need_timer)
+	{
+		totaltime = INSTR_TIME_GET_DOUBLE(instr->counter);
 
-	instr->startup += instr->firsttuple;
-	instr->total += totaltime;
+		instr->startup += instr->firsttuple;
+		instr->total += totaltime;
+	}
 	instr->ntuples += instr->tuplecount;
 	instr->nloops += 1;
 
 	/* Reset for next cycle (if any) */
 	instr->running = false;
-	INSTR_TIME_SET_ZERO(instr->starttime);
-	INSTR_TIME_SET_ZERO(instr->counter);
-	instr->firsttuple = 0;
+	if (instr->need_timer)
+	{
+		INSTR_TIME_SET_ZERO(instr->starttime);
+		INSTR_TIME_SET_ZERO(instr->counter);
+		instr->firsttuple = 0;
+	}
 	instr->tuplecount = 0;
 }
 
@@ -171,16 +178,21 @@ InstrAggNode(Instrumentation *dst, Instrumentation *add)
 	if (!dst->running && add->running)
 	{
 		dst->running = true;
-		dst->firsttuple = add->firsttuple;
+		if (dst->need_timer && add->need_timer)
+			dst->firsttuple = add->firsttuple;
 	}
-	else if (dst->running && add->running && dst->firsttuple > add->firsttuple)
+	else if (dst->need_timer && add->need_timer && dst->running && add->running
+			 && dst->firsttuple > add->firsttuple)
 		dst->firsttuple = add->firsttuple;
 
-	INSTR_TIME_ADD(dst->counter, add->counter);
+	if (dst->need_timer && add->need_timer)
+	{
+		INSTR_TIME_ADD(dst->counter, add->counter);
 
+		dst->startup += add->startup;
+		dst->total += add->total;
+	}
 	dst->tuplecount += add->tuplecount;
-	dst->startup += add->startup;
-	dst->total += add->total;
 	dst->ntuples += add->ntuples;
 	dst->ntuples2 += add->ntuples2;
 	dst->nloops += add->nloops;