purplesyringa's blog

Posts from purplesyringa's blog.
https://purplesyringa.moe/blog/ (RSS)
visit blog
The RAM myth
19 Dec 2024 | original ↗

The RAM myth is a belief that modern computer memory resembles perfect random-access memory. Cache is seen as an optimization for small data: if it fits in L2, it’s going to be processed faster; if it doesn’t, there’s nothing we can do. Most likely, you believe that code like this is the fastest way to shard data (I’m using Python as pseudocode;...

Thoughts on Rust hashing
12 Dec 2024 | original ↗

In languages like Python, Java, or C++, values are hashed by calling a “hash me” method on them, implemented by the type author. This fixed-hash size is then immediately used by the hash table or what have you. This design suffers from some obvious problems, like: How do you hash an integer? If you use a no-op hasher (booo), DoS attacks on hash...

Any Python program fits in 24 characters*
17 Nov 2024 | original ↗

* If you don’t take whitespace into account. My friend challenged me to find the shortest solution to a certain Leetcode-style problem in Python. They were generous enough to let me use whitespace for free, so that the code stays readable. So that’s exactly what we’ll abuse to encode any Python program in 24 bytes, ignoring whitespace.

The Rust Trademark Policy is still harmful
10 Nov 2024 | original ↗

Four days ago, the Rust Foundation released a new draft of the Rust Language Trademark Policy. The previous draft caused division within the community several years ago, prompting its retraction with the aim of creating a new, milder version. Well, that failed. While certain issues were addressed (thank you, we appreciate it!), the new version...

Bringing faster exceptions to Rust
6 Nov 2024 | original ↗

Three months ago, I wrote about why you might want to use panics for error handling. Even though it’s a catchy title, panics are hardly suited for this goal, even if you try to hack around with macros and libraries. The real star is the unwinding mechanism, which powers panics. This post is the first in a series exploring what unwinding is, how...

We built the best "Bad Apple!!" in Minecraft
10 Oct 2024 | original ↗

Demoscene is the art of pushing computers to perform tasks they weren’t designed to handle. One recurring theme in demoscene is the shadow-art animation “Bad Apple!!”. We’ve played it on the Commodore 64, Vectrex (a unique game console utilizing only vector graphics), Impulse Tracker, and even exploited Super Mario Bros. to play it. But how about...

WebP: The WebPage compression format
7 Sept 2024 | original ↗

I want to provide a smooth experience to my site visitors, so I work on accessibility and ensure it works without JavaScript enabled. I care about page load time because some pages contain large illustrations, so I minify my HTML. But one thing makes turning my blog light as a feather a pain in the ass.

Division is hard, but it doesn't have to be
24 Aug 2024 | original ↗

Developers don’t usually divide numbers all the time, but hashmaps often need to compute remainders modulo a prime. Hashmaps are really common, so fast division is useful. For instance, rolling hashes might compute u128 % u64 with a fixed divisor. Compilers just drop the ball here: fn modulo(n: u128) -> u64 { (n % 0xffffffffffffffc5) as u64 }...

I sped up serde_json strings by 20%
20 Aug 2024 | original ↗

I have recently done some performance work and realized that reading about my experience could be entertaining. Teaching to think is just as important as teaching to code, but this is seldom done; I think something I’ve done last month is a great opportunity to draw the curtain a bit. serde is the Rust framework for serialization and...

You might want to use panics for error handling
13 Aug 2024 | original ↗

Rust’s approach to error handling comes at a cost. The Result type often doesn’t fit in CPU registers, and callers of fallible functions have to check whether the returned value is Ok or Err. That’s a stack spill, a comparison, a branch, and a lot of error handling code intertwined with the hot path that just shouldn’t be here, which inhibits...

The sentinel trick
13 Aug 2024 | original ↗

The sentinel trick underlies a data structure with the following requirements: Read element by index in O ( 1 ) , Write element by index in O ( 1 ) , Replace all elements with a given value in O ( 1 ) . It is not a novel technique by any means, but it doesn’t seem on everyone’s lips, so some of you might find it interesting.

I thought I was smart enough to play with fire
20 Jun 2024 | original ↗

blazingio cuts corners by design. It keeps the constant factor small and uses long forgotten algorithms people used before processors supported SIMD and integer division. But another limitation made this task much harder. Size. Professional libraries start exceeding the Codeforces limit of 64 KiB really fast. Code minification barely helps, and...

Recovering garbled Bitcoin addresses
23 Apr 2024 | original ↗

ZeroNet is a decentralized network that enables dynamic sites, such as blogs and forums, unlike popular content-addressed storage networks that came later. Sites aren’t addressed by immutable hashes; instead, site updates are signed by Bitcoin addresses. A moot point is that Bitcoin addresses are case-sensitive, and people are used to addresses...

↑ These items are from RSS. Visit the blog itself at https://purplesyringa.moe/blog/ to find everything else and to appreciate author's digital home.