From d9ae7847eac7f6641b337b4dd0bd643ea93cebd9 Mon Sep 17 00:00:00 2001 From: Karol Sobczak Date: Wed, 21 Jul 2021 11:29:41 +0200 Subject: [PATCH] Improve positionsArrayToSelectedPositions * Use boolean casting instead of if to avoid branching * Finish loop early when there are no more selected positions --- .../io/trino/operator/project/PageFilter.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/core/trino-main/src/main/java/io/trino/operator/project/PageFilter.java b/core/trino-main/src/main/java/io/trino/operator/project/PageFilter.java index f5fd417e8702..7fe96d09efb8 100644 --- a/core/trino-main/src/main/java/io/trino/operator/project/PageFilter.java +++ b/core/trino-main/src/main/java/io/trino/operator/project/PageFilter.java @@ -29,9 +29,9 @@ static SelectedPositions positionsArrayToSelectedPositions(boolean[] selectedPos int selectedCount = 0; for (int i = 0; i < size; i++) { boolean selectedPosition = selectedPositions[i]; - if (selectedPosition) { - selectedCount++; - } + // Avoid branching by casting boolean to integer. + // This improves CPU utilization by avoiding branch mispredictions. + selectedCount += selectedPosition ? 1 : 0; } if (selectedCount == 0 || selectedCount == size) { @@ -40,11 +40,11 @@ static SelectedPositions positionsArrayToSelectedPositions(boolean[] selectedPos int[] positions = new int[selectedCount]; int index = 0; - for (int position = 0; position < size; position++) { - if (selectedPositions[position]) { - positions[index] = position; - index++; - } + for (int position = 0; index < selectedCount; position++) { + // Improve CPU utilization by avoiding setting of position conditionally. + // This improves CPU utilization by avoiding branch mispredictions. + positions[index] = position; + index += selectedPositions[position] ? 1 : 0; } return SelectedPositions.positionsList(positions, 0, selectedCount); }