スキル一覧に戻る
Dangercoder

cljr-performance

by Dangercoder

Clojure -> C# transpiler with NRepl support

0🍴 0📅 2025年12月7日
GitHubで見るManusで実行

SKILL.md


name: cljr-performance description: Optimize Cljr compiler and runtime performance. Use when optimizing emitter output, runtime collections, REPL evaluation, or leveraging .NET 10/C# 14 features. Covers Span, FrozenDictionary, AggressiveInlining, benchmarking, and allocation reduction strategies.

Cljr Performance Optimization

This skill guides performance optimization for the Cljr Clojure-to-.NET compiler, targeting .NET 10 with C# 14 preview features.

When to use this skill

  • Optimizing emitter-generated C# code
  • Improving runtime collection performance
  • Reducing memory allocations
  • Leveraging .NET 10 / C# 14 performance features
  • Writing or analyzing benchmarks
  • Optimizing REPL evaluation performance

Project Performance Profile

Target Framework

  • Runtime: .NET 10 (LTS)
  • Language: C# 14 preview (Runtime, CLI, REPL) / C# 12 (Compiler, SourceGenerator)

Existing Optimizations

OptimizationStatusLocation
Span<T> / ReadOnlySpan<T>PersistentVector
FrozenDictionaryProtocol, MethodImplCache
[AggressiveInlining]Hot paths throughout
Symbol/Keyword interningSymbol.cs, Keyword.cs
HAMT with SIMD PopCountPersistentHashMap
32-way triePersistentVector
Transient collectionsVector, HashMap batch ops
Method dispatch cachingMultiFn, Protocol
BenchmarkDotNet suitetests/Cljr.Benchmarks/

Opportunities for Further Optimization

OptimizationStatusPotential Use
stackallocSmall temp arrays in hot paths
ArrayPool<T>Reusable buffer arrays
SearchValues<T>Character/byte searching
CompositeFormatString formatting
C# 14 implicit span conversionsCleaner span APIs
AVX10.2 intrinsicsSIMD operations

Performance Optimization Workflow

Step 1: Measure First

Never optimize without benchmarks. Run existing benchmarks:

cd tests/Cljr.Benchmarks
dotnet run -c Release -- --filter "*"

Or specific benchmarks:

dotnet run -c Release -- --filter "VectorBenchmarks"
dotnet run -c Release -- --filter "*Conj*"

Step 2: Identify Hot Paths

Use profiling or benchmark results to identify:

  • High-frequency operations
  • Allocation-heavy code paths
  • Cache miss patterns

Step 3: Apply Optimizations

See reference files for specific patterns:

Step 4: Verify Improvement

Re-run benchmarks and compare:

dotnet run -c Release -- --filter "YourBenchmark" --runtimes net10.0

Quick Reference: Key Optimizations

AggressiveInlining

For small, frequently-called methods:

[MethodImpl(MethodImplOptions.AggressiveInlining)]
public T GetValue() => _value;

Span for Zero-Copy

// Instead of creating arrays
public ReadOnlySpan<object?> ArrayFor(int i) => _tail.AsSpan();

// Span-based construction (already in PersistentVector)
public static PersistentVector Create(ReadOnlySpan<object?> items)

FrozenDictionary for Read-Heavy Lookups

using System.Collections.Frozen;

// Mutable during construction
private readonly ConcurrentDictionary<Type, Cache> _impls = new();
// Frozen for fast reads
private volatile FrozenDictionary<Type, Cache>? _frozen;

public void Freeze() => _frozen = _impls.ToFrozenDictionary();

Symbol/Keyword Interning

Already implemented - ensures reference equality:

// Good: reference equality after interning
if (ReferenceEquals(sym1, sym2)) { ... }

// Avoid: value equality is slower
if (sym1.Equals(sym2)) { ... }

Transients for Batch Operations

// Slow: O(n²) allocations
var vec = PersistentVector.Empty;
foreach (var item in items)
    vec = vec.Conj(item);

// Fast: O(n) with transient
var transient = PersistentVector.Empty.AsTransient();
foreach (var item in items)
    transient.ConjBang(item);
return transient.Persistent();

Key Files

AreaFiles
Runtime Collectionssrc/Cljr.Runtime/Collections/PersistentVector.cs, PersistentHashMap.cs
Protocol Dispatchsrc/Cljr.Runtime/Protocol.cs, MultiFn.cs
Symbol Interningsrc/Cljr.Runtime/Symbol.cs, Keyword.cs
Emittersrc/Cljr.Compiler/Emitter/CSharpEmitter.cs
Benchmarkstests/Cljr.Benchmarks/CollectionBenchmarks.cs

References

External Resources

スコア

総合スコア

50/100

リポジトリの品質指標に基づく評価

SKILL.md

SKILL.mdファイルが含まれている

+20
LICENSE

ライセンスが設定されている

0/10
説明文

100文字以上の説明がある

0/10
人気

GitHub Stars 100以上

0/15
最近の活動

3ヶ月以内に更新がある

0/10
フォーク

10回以上フォークされている

0/5
Issue管理

オープンIssueが50未満

+5
言語

プログラミング言語が設定されている

+5
タグ

1つ以上のタグが設定されている

0/5

レビュー

💬

レビュー機能は近日公開予定です