Telixon Benchmark

Benchmark vs libphonenumber-js and google-libphonenumber

Engine compiled from Google's libphonenumber source at github.com/google/libphonenumber@6e46509.
Corpus: 1,132 phone numbers, one Google example per region per type (the example set the conformance corpus is derived from).
Compared against the npm packages libphonenumber-js@1.13.3 and google-libphonenumber@3.2.44 (a community wrapper around Google's libphonenumber JS source).
Generated 2026-07-21T18:06:32.366Z.

Parse

Parse cost only.

Operation Telixon (ops/s) libphonenumber-js (ops/s) google-libphonenumber (ops/s) vs libphonenumber-js vs google-libphonenumber
parsePhoneNumber (corpus pass)7741501765.16×4.39×

Strict cold

Parse + one method call. Telixon module caches cleared per iteration.

Method Telixon (ops/s) libphonenumber-js (ops/s) google-libphonenumber (ops/s) vs libphonenumber-js vs google-libphonenumber
isValid562123944.57×5.98×
isPossible4891361683.60×2.90×
isPossibleWithReason526641678.21×3.16×
getNumberType564107915.26×6.20×
getNationalNumber6931361735.08×4.01×
getCallingCode6791451754.68×3.88×
getRegion6181441444.30×4.29×
formatE1645071451653.50×3.07×
formatRfc39663171331012.39×3.13×
formatNational304941073.22×2.85×
formatInternational323901123.60×2.89×

Cold

Parse + one method call. Caches retained across iterations.

Method Telixon (ops/s) libphonenumber-js (ops/s) google-libphonenumber (ops/s) vs libphonenumber-js vs google-libphonenumber
isValid585118964.94×6.11×
isPossible5261341673.91×3.16×
isPossibleWithReason538661678.19×3.23×
getNumberType583114955.11×6.14×
getNationalNumber7041451764.86×4.01×
getCallingCode7001451764.82×3.98×
getRegion6151461444.22×4.27×
formatE1645121451703.54×3.02×
formatRfc39663381351032.50×3.28×
formatNational348941073.68×3.24×
formatInternational389901134.34×3.43×

Warm

Pre-parsed value, method called repeatedly. Where libphonenumber-js stores the value as a direct property after parse (nationalNumber, countryCallingCode, number, country), a property read is 1-4% faster than Telixon's cached method call.

Method Telixon (ops/s) libphonenumber-js (ops/s) google-libphonenumber (ops/s) vs libphonenumber-js vs google-libphonenumber
isValid30.5k68422044.66×138.87×
isPossible30.5k2.2k4.3k13.83×7.05×
isPossibleWithReason29.2k1154.0k254.06×7.27×
getNumberType33.0k59721955.20×150.19×
getNationalNumber33.4k33.6k20.7k0.99×1.61×
getCallingCode34.1k34.0k23.9k1.00×1.43×
getRegion34.7k34.1k8301.02×41.77×
formatE16434.5k35.5k10.0k0.97×3.44×
formatRfc396629.9k2.3k24813.06×120.54×
formatNational27.9k28928396.32×98.59×
formatInternational28.1k247322113.46×87.04×

Input controller

Telixon only: competitor formatters have no comparable API (no caret, no deletion, no undo, no per-keystroke queries). One iteration is a full corpus pass: every digit of all 1,132 corpus numbers, typed end to end through the controller. Read the mean column as "what typing the entire corpus costs"; single keystrokes are profiled in the next section.

Scenario ops/s mean (ms) p99 (ms) ±rme
type-through full number (corpus pass)3330.5133.70±2.02%
type-through + core PhoneNumber query methods per keystroke (corpus pass)1469.3870.86±0.79%
backspace at caret after full type-through (corpus pass)1660.7363.11±1.08%
type-through + undo + redo (corpus pass)3230.9232.32±1.27%
full undo back to empty + redo to full (corpus pass)3231.6633.83±1.70%

Per-keystroke latency

The number that decides whether an input feels instant: the cost of one keystroke, sampled individually (process.hrtime.bigint() after warmup). For scale, the panel below measures that latency against one display frame across common refresh rates (60-360 Hz); the benchmark itself runs headless, so it assumes no single display.

1.24 µs
median keystroke
insert + resolve + format + caret
401×
margin under one frame
p99 keystroke 6.93 µs vs a 360 Hz frame (more at lower rates)
30.51 ms
the whole corpus, typed
every digit of all 1,132 numbers
One frame at 360 Hz, the strictest common refresh rate (slower displays have more headroom). The line at the left edge is the p99 keystroke (6.93 µs), drawn at minimum visible width; to scale it would be 0.250% of the bar.
Scenario samples mean p50 p95 p99
international: insert per keystroke68,7201.26 µs1.24 µs2.19 µs3.33 µs
international: insert + 7 query methods per keystroke68,7202.15 µs1.95 µs3.91 µs6.93 µs

Worst-case (p99) keystroke against one frame, at common display refresh rates:

Display refresh rateOne framep99 keystroke headroom
60 Hz16.67 ms2,405×
120 Hz8.33 ms1,202×
240 Hz4.17 ms601×
360 Hz (strictest)2.78 ms401×
A higher refresh rate is a shorter frame and a stricter bar, so the headroom shrinks as the rate rises. Clearing the strictest rate clears every slower display. Reference scales only -- the benchmark runs headless.

Across 137,440 sampled keystrokes, the 99th percentile is 6.93 µs. The maximum and deep tail are omitted: they are dominated by OS scheduling, not the code, and grow with sample count.

Phone-number processing alone stays orders of magnitude under one frame at every standard refresh rate.