Skip to content

Conversation

@kateinoigakukun
Copy link
Member

trimmedDescription allocates two new Syntax nodes just to get the trimmed description of a node.

extension SyntaxProtocol {
  public var trimmedDescription: String {
    // TODO: We shouldn't need to create to copies just to get the trimmed
    // description.
    return self.trimmed.description
  }
  public var trimmed: Self {
    // TODO: Should only need one new node here
    return self.with(\.leadingTrivia, []).with(\.trailingTrivia, [])
  }
}

It speeds up 4x faster

$ cat check.d.ts
export function getCanvas(x: string): HTMLCanvasElement;

$ node Plugins/BridgeJS/Sources/TS2Swift/JavaScript/bin/ts2swift.js check.d.ts -p tsconfig.json -o out.swift
$ hyperfine "./Plugins/BridgeJS/.build/debug/BridgeJSToolInternal.before emit-skeleton out.swift" "./Plugins/BridgeJS/.build/debug/BridgeJSToolInternal.after emit-skeleton out.swift"
Benchmark 1: ./Plugins/BridgeJS/.build/debug/BridgeJSToolInternal.before emit-skeleton out.swift
  Time (mean ± σ):     16.531 s ±  0.317 s    [User: 16.355 s, System: 0.107 s]
  Range (min … max):   16.026 s … 17.252 s    10 runs

Benchmark 2: ./Plugins/BridgeJS/.build/debug/BridgeJSToolInternal.after emit-skeleton out.swift
  Time (mean ± σ):      4.068 s ±  0.134 s    [User: 3.976 s, System: 0.039 s]
  Range (min … max):    4.000 s …  4.445 s    10 runs

Summary
  ./Plugins/BridgeJS/.build/debug/BridgeJSToolInternal.after emit-skeleton out.swift ran
    4.06 ± 0.15 times faster than ./Plugins/BridgeJS/.build/debug/BridgeJSToolInternal.before emit-skeleton out.swift

…node allocation

`trimmedDescription` allocates two new Syntax nodes just to get the
trimmed description of a node.

```swift
extension SyntaxProtocol {
  public var trimmedDescription: String {
    // TODO: We shouldn't need to create to copies just to get the trimmed
    // description.
    return self.trimmed.description
  }
  public var trimmed: Self {
    // TODO: Should only need one new node here
    return self.with(\.leadingTrivia, []).with(\.trailingTrivia, [])
  }
}
```

```
$ cat check.d.ts
export function getCanvas(x: string): HTMLCanvasElement;

$ node Plugins/BridgeJS/Sources/TS2Swift/JavaScript/bin/ts2swift.js check.d.ts -p tsconfig.json -o out.swift
$ hyperfine "./Plugins/BridgeJS/.build/debug/BridgeJSToolInternal.before emit-skeleton out.swift" "./Plugins/BridgeJS/.build/debug/BridgeJSToolInternal.after emit-skeleton out.swift"
Benchmark 1: ./Plugins/BridgeJS/.build/debug/BridgeJSToolInternal.before emit-skeleton out.swift
  Time (mean ± σ):     16.531 s ±  0.317 s    [User: 16.355 s, System: 0.107 s]
  Range (min … max):   16.026 s … 17.252 s    10 runs

Benchmark 2: ./Plugins/BridgeJS/.build/debug/BridgeJSToolInternal.after emit-skeleton out.swift
  Time (mean ± σ):      4.068 s ±  0.134 s    [User: 3.976 s, System: 0.039 s]
  Range (min … max):    4.000 s …  4.445 s    10 runs

Summary
  ./Plugins/BridgeJS/.build/debug/BridgeJSToolInternal.after emit-skeleton out.swift ran
    4.06 ± 0.15 times faster than ./Plugins/BridgeJS/.build/debug/BridgeJSToolInternal.before emit-skeleton out.swift
```
@kateinoigakukun kateinoigakukun merged commit 81885ea into main Feb 4, 2026
11 checks passed
@kateinoigakukun kateinoigakukun deleted the yt/perf-tune-swift2skeleton branch February 4, 2026 11:54
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants