such a great feeling when you find all your stack used in the wild
25.02.2026 16:14
๐ 4
๐ 2
๐ฌ 1
๐ 0
It's paper submission day!! How's your's shaping up?
19.02.2026 14:54
๐ 1
๐ 1
๐ฌ 1
๐ 0
Optimizing an MP3 Codec with OCaml/OxCaml
After reading Anilโs post about his zero-allocation HTTP parser httpz, I decided to apply some OxCaml optimisation techniques to my pure OCaml MP3 encoder/decoder.
The OCaml-based MP3 encoder/decoder has been the most ambitious project Iโve tried in Opus 4.5. It was a struggle to get it over the line, and I even needed to read large chunks of the ISO standard and get to grips with some of the maths and help the AI troubleshoot.
# Profiling an OCaml MP3 Decoder with Landmarks
Before dividing into OxCaml, I wanted to get a feel for the current performance and also to make obvious non-OxCaml performance improvements; otherwise, I would be comparing an optimised OxCaml version with an underperforming OCaml version.
It was 40 times slower than `ffmpeg`: 29.5 seconds to decode a 3-minute file versus 0.74 seconds. I used the landmarks profiling library to identify and fix the bottlenecks, bringing decode time down to 3.5 seconds (a 8x speedup).
## Setting Up Landmarks
Landmarks is an OCaml profiling library that instruments functions and reports cycle counts. It was easy to add to the project (*) with a simple edit of the `dune` file:
(libraries ... landmarks)
(preprocess (pps landmarks-ppx --auto))
The `--auto` flag automatically instruments every top-level function โ no manual annotation needed. Running the decoder with `OCAML_LANDMARKS=on` prints a call tree with cycle counts and percentages.
> (*) It needed OCaml 5.3.0 for `landmarks-ppx` compatibility; it wouldnโt install on OCaml 5.4.0 due to a ppxlib version constraint.
## Issues
78% of the time was spent in the Huffman decoding, specifically `decode_pair`. The implementation read one bit at a time, then scanned the table for a matching Huffman code. I initially tried a Hashtbl, which was much better than the scan before deciding to use array lookup instead.
The bitstream operations still accounted for much of the time, but these could be optimised with appropriate `Bytes.get_...` calls, as the most frequent path is reading 32 bits in big endian layout.
The profile now showed `find_sfb_long` consuming 3.4 billion cycles inside requantization. This function does a linear search through scalefactor band boundaries for every one of the 576 frequency lines, every granule, every frame. Switching to precomputed 576-entry arrays mapping each frequency line directly to its scalefactor band index.
There were some additional tweaks, such as adding more precomputed lookup tables stored in `floatarray`, using `[@inline]` and `unsafe_get`, `land` instead of `mod`.
After this, no single function dominated the profile, and I could move on to OxCaml.
# OxCaml
OxCaml has `float#`, an unboxed float type that lives in registers, and `let mutable` for stack-allocated mutable variables. Together, they let you write inner loops where the accumulator never touches the heap:
module F = Stdlib_upstream_compatible.Float_u
let[@inline] imdct_long input =
for i = 0 to 35 do
let mutable sum : float# = F.of_float 0.0 in
for k = 0 to 17 do
let cos_val = F.of_float (Float.Array.unsafe_get cos_table (i * 18 + k)) in
let inp_val = F.of_float (Array.unsafe_get input k) in
sum <- F.add sum (F.mul inp_val cos_val)
done;
Array.unsafe_set output i (F.to_float sum)
done
These kinds of optimisations got me from 2.35s down to 2.01s.
What I felt was missing was an accessor function which returned an unboxed float from a floatarray, so I wouldnโt need to unbox with `F.of_float`. However, I couldnโt find it.
The httpz parser really benefited from OxCamlโs unboxed types because its hot path operates on small unboxed records that stay entirely in registers:
#{ off: int16#; len: int16# }
# Results
The optimisations brought a 29.5s MP3 decoder down to 2.01s. Mostly through standard OCaml optimisations, but OxCamlโs `float#` saved another ~14%.
Decoder | Time | vs ffmpeg
---|---|---
ffmpeg | 0.74s | 1x
LAME | 0.81s | 1.1x
ocaml-mp3 (original) | 29.5s | 40x
ocaml-mp3 (Hashtbl) | 6.4s | 8.6x
ocaml-mp3 (flat + fast bitstream) | 3.5s | 4.7x
ocaml-mp3 (best) | 2.4s | 3.2x
ocaml-mp3 (OxCaml) | 2.0s | 2.7x
OxCaml isn't just useful due to its language extensions; it's making us think through how to engineer OCaml code to be lower allocation by default even before switching. See Mark's progress on an MP3 decoder to speed it up 10x https://www.tunbury.org/2026/02/11/ocaml-mp3/
12.02.2026 14:09
๐ 10
๐ 5
๐ฌ 0
๐ 0
Reminder: We are meeting tomorrow morning for a #FunctionalProgramming #meetup. Everyone is welcome to attend! See you there!
#FunctionalProgramming #India #Meetup #Haskell #PureScript #Erlang #Scala #OCaml #TypeScript #Rust #Clojure
06.02.2026 13:01
๐ 5
๐ 2
๐ฌ 0
๐ 0
Native support for mlx in the ocaml-lap-server
(syntax highlight, and all LSP features from ocaml in mlx)
02.02.2026 19:51
๐ 8
๐ 3
๐ฌ 1
๐ 0
OCaml is already a sweet spot between Go and Rust, but is rapidly gaining the same performance capabilities of Rust without the same cognitive overhead needed for your entire application.
02.02.2026 22:58
๐ 18
๐ 4
๐ฌ 2
๐ 0
My (very) fast zero-allocation webserver using OxCaml
Building httpz, a high-performance HTTP/1.1 parser with zero heap allocation using OxCaml's unboxed types, local allocations, and mutable local variables.
Got my website running live on my zero-allocation (ish) OxCaml webserver! First of a series of posts on building out our planetary computing system infrastructure using the performance extensions in the Jane Street fork of OCaml. https://anil.recoil.org/notes/oxcaml-httpz
01.02.2026 21:54
๐ 15
๐ 4
๐ฌ 4
๐ 1
Welcome to a World of OCaml
OCaml is a general-purpose, industrial-strength programming language with an emphasis on expressiveness and safety.
omg ocaml.org supports displaying source code in api docs now! (like haddock or rustdoc) and they support jump to definition! (like haddock but unlike rustdoc)
when did that happen, that's really awesome!
27.01.2026 23:57
๐ 29
๐ 4
๐ฌ 4
๐ 0
Reminder: #BOBkonf2026 early bird ticket sales end tomorrow, 16 January, at 23:59 UTC+1!
15.01.2026 14:48
๐ 5
๐ 5
๐ฌ 0
๐ 1
Devcontainer for using O(x)Caml and Claude in your projects
A prebuilt Docker devcontainer for sandboxed OCaml and OxCaml development with Claude Code, including multiarch builds and network isolation.
I had a bunch of people ask how to replicate my advent of agentic humps setup, so I've published the OCaml and OxCaml devcontainers to let you run unattended Claude with permissions bypass and container sandboxing. It hasn't deleted all my data yeNOSIGNAL anil.recoil.org/notes/ocaml-...
08.01.2026 11:06
๐ 7
๐ 2
๐ฌ 2
๐ 1
Hello from OCaml world!
11.01.2026 17:06
๐ 5
๐ 2
๐ฌ 0
๐ 0
[OCaml Planet] ๐ซ Patrick Ferris published the December 2025 OCaml Roundup. Tracks library updates, tooling changes, and community activity for the month.
12.01.2026 11:19
๐ 3
๐ 1
๐ฌ 1
๐ 0
AoAH Day 13: Heckling an OCaml HTTP client from 50 implementations in 10 languages
Agentically synthesising a batteries-included OCaml HTTP client by gathering recommendations from fifty open-source implementations across JavaScript, Python, Java, Rust, Swift, Haskell, Go, C++, PHP ...
For my last few days of my Advent of Agentic Humps, I blended 50 different language ecosystem's HTTP clients to brew an OCaml Requests library. Agents figured out the random quirks needed for a client by getting advice from our friends in Java, Haskell, C, C#, Python anil.recoil.org/notes/aoah-2...
14.12.2025 17:23
๐ 3
๐ 3
๐ฌ 2
๐ 0
Thank you โ we'll get on that!
08.12.2025 15:37
๐ 0
๐ 0
๐ฌ 0
๐ 0
Ocsigen: A Full OCaml Framework for Websites and Apps
Discover the OCaml web development framework Ocsigen, from its origins to its many helpful features!
Curious about using functional programming for web development? This blog post gives you an overview of Ocsigen, a full web development framework for OCaml! tarides.com/blog/2025-10...
04.12.2025 11:28
๐ 7
๐ 4
๐ฌ 0
๐ 0
GitHub - aguluman/advent-of-code-ocaml: Advent of Code Solutions In OCaml
Advent of Code Solutions In OCaml. Contribute to aguluman/advent-of-code-ocaml development by creating an account on GitHub.
Hey everyone.
If you interested in doing Advent of Code this year with a new language and are leaning towards FP.
I have made an OCaml template repo to get you started.
It also has NIX support to avoid dependency hell.
I hope you have fun using the project just as I have.
github.com/aguluman/adv...
29.11.2025 10:45
๐ 12
๐ 3
๐ฌ 1
๐ 0
Thank you, fixed!
18.11.2025 11:20
๐ 0
๐ 0
๐ฌ 0
๐ 0
OCaml 5.4 Release: New Features, Fixes, and More!
An overview of the OCaml 5.4 update highlighting new features and bug fixes!
The 5.4 update of OCaml is out! Check out our blog for an overview of the biggest new features and fixes๐ซ tarides.com/blog/2025-10...
13.11.2025 14:10
๐ 7
๐ 3
๐ฌ 1
๐ 1
Foundations for hacking on OCaml ยท KC Sivaramakrishnan
Putting this OCaml out there for posterity sake.
The resources in the post is super valuable.
kcsrk.info/ocaml/2025/1...
11.11.2025 09:49
๐ 9
๐ 3
๐ฌ 0
๐ 0
day 3 of posting FUN OCaml 2025 talk recordings!
https://youtu.be/UfrryqltZUQ?si=btHKGf_3OoGC-xmX
10.11.2025 07:35
๐ 5
๐ 2
๐ฌ 0
๐ 0