The only usable ByteCountFormatStyle is decimal

Swift makes it relatively easy to format numbers as byte counts, with appropriate suffixes to indicate units and generally sensible auto-selection of scale factors. e.g.: 1 kB (in English – results may vary depending on locale) This is just a small subset of Swift’s FormatStyle-based formatting capabilities, with which I have a bit of a… Read more

Fucking FormatStyle

I have a bit of a love-hate relationship with Swift’s FormatStyle-based formatting capabilities. 42% (in English – results may vary depending on locale) On the pro side: But the cons are rough: All in all, there’s a reason fuckingformatstyle.com exists (and don’t forget to tip!).

Copy-on-write on APFS

APFS (like many modern file systems but unlike its predecessor HFS+) supports copy-on-write. This means you can logically copy a file – it looks and behaves like a distinct file – but it doesn’t immediately copy the file’s contents on disk – it merely shares them with the original. Only if and as you modify… Read more

Swift sucks at web serving… or does it?

Chart showing throughput (requests per second) over number of concurrent requests, for four different web servers (representing the programming languages JavaScript, PHP, Kotlin - erroneously labelled as Java on the chart - and Swift).

A few weeks ago, Axel Roest published a simple web server comparison, that turned out to not be doing what it was thought to be doing. Figuring that out was a very interesting discussion that warrants a retrospective, to look at which parts were particularly helpful and which not so much. Tangentially, I want to… Read more

Swift tip: the swap function

The following code prints the Fibonacci sequence. You’ve probably seen it before. It’s one of the simplest and most well-known examples of a sliding window operation – where the next value depends on the preceding two (or more) values. While almost all programs do not calculate the Fibonacci sequence, many do contain similar sliding-window algorithms.… Read more

URLSession performance for reading a byte stream

What’s the best way to read a stream of bytes with URLSession? That’s the simple question I set out to answer. I wrote some benchmarks. They read a 128 MiB file and perform a contrived aggregation of its content bytes (a joking “hash” of them, merely to ensure the actual reads aren’t optimised out). ⚠️… Read more

Swift’s native Clocks are very inefficient

Screenshot of Instruments showing the outline view for a Time Profile, expanded to show dozens of spurious, overhead functions taking up the vast majority of the runtime.

By which I mean, things like ContinuousClock and SuspendingClock. In absolute terms they don’t have much overhead – think sub-microsecond for most uses. Which makes them perfectly acceptable when they’re used sporadically (e.g. only a few times per second). However, if you need to deal with time and timing more frequently, their inefficiency can become… Read more