docs / benchmarks / lang

Benchmarks index
  1. Overview
  1. Exemptions
  2. Methodology

aot

  1. Overview
  2. Components

codec

  1. Overview
  2. Base32
  3. Base64
  4. Deflate (dev.cajeta.codec)

codec / csv

  1. CSV

codec / json

  1. JSON

collection

  1. Overview
  2. ArrayList
  3. BPlusTree
  4. Cache
  5. Collectors
  6. HashMap
  7. HashSet
  8. Heap
  9. ImmutableList
  10. ImmutableMap
  11. ImmutableSet
  12. LinkedList
  13. RedBlackTree
  14. Sort

collection / ltm

  1. LtmBPlusTree

concurrent

  1. Overview
  2. AtomicInt32
  3. AtomicInt64
  4. Channel
  5. Fiber
  6. FiberLocal
  7. Lock
  8. Mutex
  9. RwLock
  10. Semaphore
  11. Tasks

gfx

  1. Overview
  2. Texture2D

hash

  1. Overview
  2. DefaultHasher
  3. Hash
  4. SipHash
  5. XXHash3

http

  1. Overview
  2. Client
  3. Server
  4. Server-sent events
  5. Start-up and footprint
  6. TLS
  7. WebSocket

io

  1. Overview
  2. Buffer

io / file

  1. Directory walk
  2. File
  3. FileInfo
  4. FileReader
  5. FileWriter
  6. Path
  7. Watcher

io / net

  1. BufferPool
  2. ByteBuffer
  3. Server
  4. TcpListener
  5. TcpStream
  6. UdpSocket

io / net / uri

  1. Uri
  2. UriBuilder

lang

  1. Overview
  2. Allocation and ownership
  3. Calls and dispatch
  4. Exceptions
  5. Guid
  6. Loops
  7. Math and SIMD
  8. Optional
  9. Pair
  10. Slice
  11. String
  12. StringBuilder
  13. Whole programs: the Benchmarks Game

lang / stream

  1. ArrayStream
  2. Stream

llm

  1. Overview
  2. Decode
  3. Kernel parity
  4. Load and first token
  5. Long context
  6. Memory
  7. Prefill

math

  1. Overview
  2. Ray
  3. Rotation
  4. Tensor
  5. Transform

math / fft

  1. Fft

math / linalg

  1. LinAlg

math / npio

  1. Npy

math / poly

  1. Poly

math / random

  1. Generator

math / stats

  1. Stats

ml

  1. Overview
  2. Classical models
  3. Neural models
  4. XGBoost

nucleo

  1. Overview
  2. Column
  3. Fuse
  4. Table
  5. Tape
  6. Transforms

primavera

  1. Overview
  2. Build time
  3. Dependency injection at scale
  4. REST endpoint
  5. Start-up and footprint
  6. Templated page

process

  1. Overview
  2. Command
  3. Process

reflect

  1. Overview
  2. Class

search

  1. Overview

search / distance

  1. Distance

search / fuzzy

  1. Matcher

search / ngram

  1. Index

time

  1. Overview
  2. Clock
  3. DateTimeFormatter
  4. Duration
  5. Instant
  6. LocalDate
  7. LocalDateTime
  8. LocalTime
  9. ZonedDateTime

toolchain

  1. Overview
  2. Binary size
  3. Build tool
  4. Compile time
  5. Debugger
  6. Notebook kernel start-up
  7. Start-up

toolchain / kernel-startup

  1. Overview
  2. Where cold-start time goes

wire

  1. Overview
  2. CompressStream
  3. Encoder
  4. SchemaEncoder

xpu

  1. Overview
  2. Device
  3. KernelBuffer
  4. KernelStream
  5. KernelTimer

xpu / mesh

  1. MeshSimplifier
Machine
no runs yet

Allocation and ownership

The cost of the single-owner heap: allocating a small object with heap and dropping it at scope end, churn with one and ten objects live, transferring ownership with # down a chain of calls, the live-allocation set on and off, arrays, and struct values that never touch the heap. The memory tab of every chart shows allocated bytes, and for the live-set rows the chart shows the same program under --live-set=on and --live-set=off.

Benchmarks

idworkloadagainstcheck
lang/alloc-small-object1e7 heap allocations of a 32-byte object, each dropped at scope endC++ new/delete and make_unique, Rust Box, Go, Java, Pythoncount
lang/alloc-churn-11e7 allocations with one object live at a timesamecount
lang/alloc-churn-101e7 allocations with ten live, oldest droppedsamecount
lang/alloc-transfer-chain1e6 objects passed with # through ten calls and dropped at the endC++ std::move of unique_ptr, Rust move, Go, Java, Pythoncount
lang/alloc-live-set-onalloc-small-object with the live-allocation set onCajeta only (the two compiler modes)count
lang/alloc-live-set-offalloc-small-object with the live-allocation set offCajeta onlycount
lang/alloc-array1e5 allocations of an int32[1024]C++, Rust, Go, Java, Pythonsum of first elements
lang/alloc-struct-value1e8 struct values constructed and read on the stackC++, Rust, Go, Java record, Pythonsum

The ownership model is the load-bearing design of the language; read the memory model before reading these numbers. Java and Go rows include their collectors’ work in the measured window; the allocation-bytes metric is the one that compares runtimes on equal terms.

Results

One chart per benchmark, for the machine selected at the top of the page. Languages are the bars, best first; Cajeta’s bar is in color and the competitors’ are gray. A skipped competitor keeps its row with the reason in place of a bar. A benchmark with no row on the selected machine says so and shows nothing else.

lang/alloc-small-object

Not yet measured on Proton.

lang/alloc-churn-1

Not yet measured on Proton.

lang/alloc-churn-10

Not yet measured on Proton.

lang/alloc-transfer-chain

Not yet measured on Proton.

lang/alloc-live-set-on

Not yet measured on Proton.

lang/alloc-live-set-off

Not yet measured on Proton.

lang/alloc-array

Not yet measured on Proton.

lang/alloc-struct-value

Not yet measured on Proton.

Reproduce

cd bench
./bench.sh --bench alloc-small-object               # Cajeta
./bench.sh --bench alloc-small-object --competitors # every pinned competitor

Every row records the compiler and competitor versions, flags, machine, OS and driver; METHODOLOGY states the rules a number must satisfy before it is published.

See also

  • Benchmark source: bench/src/main/cajeta/bench/lang/

Source: bench/lang/Allocation.md · 2 min read · 391 words