Skip to content

Sprinkle #[inline] across scylla-cql crate to allow inlining into scylla crate #949

Open
@wprzytula

Description

@wprzytula

Motivation

Having read the guidelines on inlining (highly recommended for everyone!), I've understood that adding #[inline] explicitly is required to allow inlining across crates.

Even with recent rustc enhancements (related PR), the inlining policy is very conservative at the moment - requires that an (already optimized) function subject to cross-crate inlining does not contain any asserts nor calls.

Problem

scylla-cql crate's functions are largely short ones and, at the same time, are heavily called by scylla crate's routines.

Suggestion

Adding #[inline] to scylla-cql short functions (as already done in e.g. recently added RowSerializationContext) can bring considerable performance benefits on the ser/de code path.

Additionally, we can think about small functions in scylla that could make the driver's users benefit from their inlining.

Note

Do not forget that #[inline] requires transitivity. In the following code:

fn foo(x: i32) -> i32 {
  x * 2
}

#[inline]
pub fn bar(x: i32) -> i32 {
  foo(x) + 1
}

if bar is called from another crate, it won't be inlined (however, IIUC, it's probable that the call to foo() will be inlined into bar body).
In order to enable inlining bar(), it is mandatory* that both foo and bar functions are marked with #[inline].

*not necessarily after the mentioned recent changes to rustc.

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or requestperformanceImproves performance of existing features

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions