Skip to content

[JExtract] Consider optional control over enum copying #348

@madsodgaard

Description

@madsodgaard

While implementing enums for JNI, we had to decide whether enum values should be copied on the Swift side or Java side. This had implications for whether we were able to use record or not to represent enum cases. We decided to eagerly copy the associated values from Java to Swift, instead of having a pointer to Swift. The latter approach would be more expensive for multiple accceses to the same field (as that would mean more JNI calls), but the former is more expensive for a single access (due to JNI reflection).

We could introduce options to customize this behaviour if the users wanted to have lazy copying for example (so just a pointer to Swift memory). It could be an annotation on the type.

Benchmarks

Here are some benchmarks we ran to compare Java vs Swift copying

Accessing two associated fields (no caching).

Benchmark                 Mode  Cnt     Score    Error  Units
EnumBenchmark.java_copy   avgt   30  1317,810 ± 16,443  ns/op
EnumBenchmark.swift_copy  avgt   30   326,424 ±  7,123  ns/op

Accessing two associated fields (cache JNI IDs in java_copy).

Benchmark                 Mode  Cnt    Score    Error  Units
EnumBenchmark.java_copy   avgt   30  505,537 ± 10,408  ns/op
EnumBenchmark.swift_copy  avgt   30  319,474 ±  5,692  ns/op

Accessing a single associated field (cache JNI IDs in java_copy).

Benchmark                 Mode  Cnt    Score    Error  Units
EnumBenchmark.java_copy   avgt   30  513,441 ±  8,825  ns/op
EnumBenchmark.swift_copy  avgt   30  437,693 ± 15,914  ns/op

Metadata

Metadata

Assignees

No one assigned

    Labels

    feature:jextractIssues related to jextract-swift

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions