Skip to content

Commit c0adb3e

Browse files
committed
perf: remove ExecutionCtx from OperationsVTable::scalar_at
The scalar_at hot path was creating and dropping an ExecutionCtx on every call via LEGACY_SESSION.create_execution_ctx(). Each creation involves an atomic fetch_add + Arc clone, and each drop an Arc release. This was called millions of times during query execution (primarily from PrimitiveTyped::value_unchecked during search_sorted and patches). Only Patched::scalar_at actually uses ctx (for .execute()), so move the ctx creation there. All other implementations had unused `_ctx` params. Profiled with apmc (Apple Silicon hardware performance counters). ClickBench (Vortex format, Apple Silicon M4 Max, 3 iterations): Metric Before After Delta Cycles 1,973.5B 1,942.6B -1.6% Instructions 4,730.2B 4,722.5B -0.16% IPC 2.40 2.43 +1.25% Wall clock 43.09s 41.92s -2.7% Dispatch stalls 593.7B 573.9B -3.3% L1D cache misses 80.7B 80.6B ~0% Branch mispredicts 11.2B 11.2B ~0% Signed-off-by: Alexander Droste <droste.alexander@gmail.com> Signed-off-by: Alexander Droste <alexander.droste@protonmail.com>
1 parent 71089dd commit c0adb3e

55 files changed

Lines changed: 154 additions & 354 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

encodings/alp/public-api.lock

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ pub fn vortex_alp::ALP::validate(&self, data: &vortex_alp::ALPData, dtype: &vort
5656

5757
impl vortex_array::array::vtable::operations::OperationsVTable<vortex_alp::ALP> for vortex_alp::ALP
5858

59-
pub fn vortex_alp::ALP::scalar_at(array: vortex_array::array::view::ArrayView<'_, vortex_alp::ALP>, index: usize, _ctx: &mut vortex_array::executor::ExecutionCtx) -> vortex_error::VortexResult<vortex_array::scalar::Scalar>
59+
pub fn vortex_alp::ALP::scalar_at(array: vortex_array::array::view::ArrayView<'_, vortex_alp::ALP>, index: usize) -> vortex_error::VortexResult<vortex_array::scalar::Scalar>
6060

6161
impl vortex_array::array::vtable::validity::ValidityChild<vortex_alp::ALP> for vortex_alp::ALP
6262

@@ -194,7 +194,7 @@ pub fn vortex_alp::ALPRD::validate(&self, data: &vortex_alp::ALPRDData, dtype: &
194194

195195
impl vortex_array::array::vtable::operations::OperationsVTable<vortex_alp::ALPRD> for vortex_alp::ALPRD
196196

197-
pub fn vortex_alp::ALPRD::scalar_at(array: vortex_array::array::view::ArrayView<'_, vortex_alp::ALPRD>, index: usize, _ctx: &mut vortex_array::executor::ExecutionCtx) -> vortex_error::VortexResult<vortex_array::scalar::Scalar>
197+
pub fn vortex_alp::ALPRD::scalar_at(array: vortex_array::array::view::ArrayView<'_, vortex_alp::ALPRD>, index: usize) -> vortex_error::VortexResult<vortex_array::scalar::Scalar>
198198

199199
impl vortex_array::array::vtable::validity::ValidityChild<vortex_alp::ALPRD> for vortex_alp::ALPRD
200200

encodings/alp/src/alp/ops.rs

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
// SPDX-FileCopyrightText: Copyright the Vortex contributors
33

44
use vortex_array::ArrayView;
5-
use vortex_array::ExecutionCtx;
65
use vortex_array::scalar::Scalar;
76
use vortex_array::vtable::OperationsVTable;
87
use vortex_error::VortexExpect;
@@ -15,11 +14,7 @@ use crate::ALPFloat;
1514
use crate::match_each_alp_float_ptype;
1615

1716
impl OperationsVTable<ALP> for ALP {
18-
fn scalar_at(
19-
array: ArrayView<'_, ALP>,
20-
index: usize,
21-
_ctx: &mut ExecutionCtx,
22-
) -> VortexResult<Scalar> {
17+
fn scalar_at(array: ArrayView<'_, ALP>, index: usize) -> VortexResult<Scalar> {
2318
if let Some(patches) = array.patches()
2419
&& let Some(patch) = patches.get_patched(index)?
2520
{

encodings/alp/src/alp_rd/ops.rs

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
// SPDX-FileCopyrightText: Copyright the Vortex contributors
33

44
use vortex_array::ArrayView;
5-
use vortex_array::ExecutionCtx;
65
use vortex_array::dtype::PType;
76
use vortex_array::scalar::Scalar;
87
use vortex_array::vtable::OperationsVTable;
@@ -13,11 +12,7 @@ use crate::ALPRD;
1312
use crate::ALPRDArrayExt;
1413

1514
impl OperationsVTable<ALPRD> for ALPRD {
16-
fn scalar_at(
17-
array: ArrayView<'_, ALPRD>,
18-
index: usize,
19-
_ctx: &mut ExecutionCtx,
20-
) -> VortexResult<Scalar> {
15+
fn scalar_at(array: ArrayView<'_, ALPRD>, index: usize) -> VortexResult<Scalar> {
2116
// The left value can either be a direct value, or an exception.
2217
// The exceptions array represents exception positions with non-null values.
2318
let maybe_patched_value = match array.left_parts_patches() {

encodings/bytebool/public-api.lock

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ pub fn vortex_bytebool::ByteBool::validate(&self, data: &Self::ArrayData, dtype:
5252

5353
impl vortex_array::array::vtable::operations::OperationsVTable<vortex_bytebool::ByteBool> for vortex_bytebool::ByteBool
5454

55-
pub fn vortex_bytebool::ByteBool::scalar_at(array: vortex_array::array::view::ArrayView<'_, vortex_bytebool::ByteBool>, index: usize, _ctx: &mut vortex_array::executor::ExecutionCtx) -> vortex_error::VortexResult<vortex_array::scalar::Scalar>
55+
pub fn vortex_bytebool::ByteBool::scalar_at(array: vortex_array::array::view::ArrayView<'_, vortex_bytebool::ByteBool>, index: usize) -> vortex_error::VortexResult<vortex_array::scalar::Scalar>
5656

5757
impl vortex_array::array::vtable::validity::ValidityVTable<vortex_bytebool::ByteBool> for vortex_bytebool::ByteBool
5858

encodings/bytebool/src/array.rs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -319,11 +319,7 @@ impl ValidityVTable<ByteBool> for ByteBool {
319319
}
320320

321321
impl OperationsVTable<ByteBool> for ByteBool {
322-
fn scalar_at(
323-
array: ArrayView<'_, ByteBool>,
324-
index: usize,
325-
_ctx: &mut ExecutionCtx,
326-
) -> VortexResult<Scalar> {
322+
fn scalar_at(array: ArrayView<'_, ByteBool>, index: usize) -> VortexResult<Scalar> {
327323
Ok(Scalar::bool(
328324
array.buffer.as_host()[index] == 1,
329325
array.dtype().nullability(),

encodings/datetime-parts/public-api.lock

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ pub fn vortex_datetime_parts::DateTimeParts::validate(&self, _data: &Self::Array
5050

5151
impl vortex_array::array::vtable::operations::OperationsVTable<vortex_datetime_parts::DateTimeParts> for vortex_datetime_parts::DateTimeParts
5252

53-
pub fn vortex_datetime_parts::DateTimeParts::scalar_at(array: vortex_array::array::view::ArrayView<'_, vortex_datetime_parts::DateTimeParts>, index: usize, _ctx: &mut vortex_array::executor::ExecutionCtx) -> vortex_error::VortexResult<vortex_array::scalar::Scalar>
53+
pub fn vortex_datetime_parts::DateTimeParts::scalar_at(array: vortex_array::array::view::ArrayView<'_, vortex_datetime_parts::DateTimeParts>, index: usize) -> vortex_error::VortexResult<vortex_array::scalar::Scalar>
5454

5555
impl vortex_array::array::vtable::validity::ValidityChild<vortex_datetime_parts::DateTimeParts> for vortex_datetime_parts::DateTimeParts
5656

encodings/datetime-parts/src/ops.rs

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
// SPDX-FileCopyrightText: Copyright the Vortex contributors
33

44
use vortex_array::ArrayView;
5-
use vortex_array::ExecutionCtx;
65
use vortex_array::dtype::DType;
76
use vortex_array::extension::datetime::Timestamp;
87
use vortex_array::scalar::Scalar;
@@ -17,11 +16,7 @@ use crate::timestamp;
1716
use crate::timestamp::TimestampParts;
1817

1918
impl OperationsVTable<DateTimeParts> for DateTimeParts {
20-
fn scalar_at(
21-
array: ArrayView<'_, DateTimeParts>,
22-
index: usize,
23-
_ctx: &mut ExecutionCtx,
24-
) -> VortexResult<Scalar> {
19+
fn scalar_at(array: ArrayView<'_, DateTimeParts>, index: usize) -> VortexResult<Scalar> {
2520
let DType::Extension(ext) = array.dtype().clone() else {
2621
vortex_panic!(
2722
"DateTimePartsArray must have extension dtype, found {}",

encodings/decimal-byte-parts/public-api.lock

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ pub fn vortex_decimal_byte_parts::DecimalByteParts::validate(&self, _data: &Self
4848

4949
impl vortex_array::array::vtable::operations::OperationsVTable<vortex_decimal_byte_parts::DecimalByteParts> for vortex_decimal_byte_parts::DecimalByteParts
5050

51-
pub fn vortex_decimal_byte_parts::DecimalByteParts::scalar_at(array: vortex_array::array::view::ArrayView<'_, vortex_decimal_byte_parts::DecimalByteParts>, index: usize, _ctx: &mut vortex_array::executor::ExecutionCtx) -> vortex_error::VortexResult<vortex_array::scalar::Scalar>
51+
pub fn vortex_decimal_byte_parts::DecimalByteParts::scalar_at(array: vortex_array::array::view::ArrayView<'_, vortex_decimal_byte_parts::DecimalByteParts>, index: usize) -> vortex_error::VortexResult<vortex_array::scalar::Scalar>
5252

5353
impl vortex_array::array::vtable::validity::ValidityChild<vortex_decimal_byte_parts::DecimalByteParts> for vortex_decimal_byte_parts::DecimalByteParts
5454

encodings/decimal-byte-parts/src/decimal_byte_parts/mod.rs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -300,11 +300,7 @@ fn to_canonical_decimal(
300300
}
301301

302302
impl OperationsVTable<DecimalByteParts> for DecimalByteParts {
303-
fn scalar_at(
304-
array: ArrayView<'_, DecimalByteParts>,
305-
index: usize,
306-
_ctx: &mut ExecutionCtx,
307-
) -> VortexResult<Scalar> {
303+
fn scalar_at(array: ArrayView<'_, DecimalByteParts>, index: usize) -> VortexResult<Scalar> {
308304
// TODO(joe): support parts len != 1
309305
let scalar = array.msp().scalar_at(index)?;
310306

encodings/fastlanes/public-api.lock

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ pub fn vortex_fastlanes::BitPacked::validate(&self, data: &Self::ArrayData, dtyp
170170

171171
impl vortex_array::array::vtable::operations::OperationsVTable<vortex_fastlanes::BitPacked> for vortex_fastlanes::BitPacked
172172

173-
pub fn vortex_fastlanes::BitPacked::scalar_at(array: vortex_array::array::view::ArrayView<'_, vortex_fastlanes::BitPacked>, index: usize, _ctx: &mut vortex_array::executor::ExecutionCtx) -> vortex_error::VortexResult<vortex_array::scalar::Scalar>
173+
pub fn vortex_fastlanes::BitPacked::scalar_at(array: vortex_array::array::view::ArrayView<'_, vortex_fastlanes::BitPacked>, index: usize) -> vortex_error::VortexResult<vortex_array::scalar::Scalar>
174174

175175
impl vortex_array::array::vtable::validity::ValidityVTable<vortex_fastlanes::BitPacked> for vortex_fastlanes::BitPacked
176176

@@ -324,7 +324,7 @@ pub fn vortex_fastlanes::Delta::validate(&self, data: &Self::ArrayData, dtype: &
324324

325325
impl vortex_array::array::vtable::operations::OperationsVTable<vortex_fastlanes::Delta> for vortex_fastlanes::Delta
326326

327-
pub fn vortex_fastlanes::Delta::scalar_at(array: vortex_array::array::view::ArrayView<'_, vortex_fastlanes::Delta>, index: usize, _ctx: &mut vortex_array::executor::ExecutionCtx) -> vortex_error::VortexResult<vortex_array::scalar::Scalar>
327+
pub fn vortex_fastlanes::Delta::scalar_at(array: vortex_array::array::view::ArrayView<'_, vortex_fastlanes::Delta>, index: usize) -> vortex_error::VortexResult<vortex_array::scalar::Scalar>
328328

329329
impl vortex_array::array::vtable::validity::ValidityVTable<vortex_fastlanes::Delta> for vortex_fastlanes::Delta
330330

@@ -414,7 +414,7 @@ pub fn vortex_fastlanes::FoR::validate(&self, data: &Self::ArrayData, dtype: &vo
414414

415415
impl vortex_array::array::vtable::operations::OperationsVTable<vortex_fastlanes::FoR> for vortex_fastlanes::FoR
416416

417-
pub fn vortex_fastlanes::FoR::scalar_at(array: vortex_array::array::view::ArrayView<'_, vortex_fastlanes::FoR>, index: usize, _ctx: &mut vortex_array::executor::ExecutionCtx) -> vortex_error::VortexResult<vortex_array::scalar::Scalar>
417+
pub fn vortex_fastlanes::FoR::scalar_at(array: vortex_array::array::view::ArrayView<'_, vortex_fastlanes::FoR>, index: usize) -> vortex_error::VortexResult<vortex_array::scalar::Scalar>
418418

419419
impl vortex_array::array::vtable::validity::ValidityChild<vortex_fastlanes::FoR> for vortex_fastlanes::FoR
420420

@@ -522,7 +522,7 @@ pub fn vortex_fastlanes::RLE::validate(&self, data: &Self::ArrayData, dtype: &vo
522522

523523
impl vortex_array::array::vtable::operations::OperationsVTable<vortex_fastlanes::RLE> for vortex_fastlanes::RLE
524524

525-
pub fn vortex_fastlanes::RLE::scalar_at(array: vortex_array::array::view::ArrayView<'_, vortex_fastlanes::RLE>, index: usize, _ctx: &mut vortex_array::executor::ExecutionCtx) -> vortex_error::VortexResult<vortex_array::scalar::Scalar>
525+
pub fn vortex_fastlanes::RLE::scalar_at(array: vortex_array::array::view::ArrayView<'_, vortex_fastlanes::RLE>, index: usize) -> vortex_error::VortexResult<vortex_array::scalar::Scalar>
526526

527527
impl vortex_array::array::vtable::validity::ValidityVTable<vortex_fastlanes::RLE> for vortex_fastlanes::RLE
528528

0 commit comments

Comments
 (0)