Dave Cheney
The acme of foolishness
GoPerformance / optimizationEssays / personalEngineering blogs
- Posts
- 270 from 5 Oct 2010 to 18 Dec 2025
- Posting
- now and then (2 in the last year)
- Kind
- personal blog
- Feed
- https://dave.cheney.net/feed
2025 2
2024 1
2021 1
2020 10
- The story of the one line fix
- How to dump the GOSSAFUNC graph for a method
- Diamond interface composition in Go 1.14
- Fatih’s question
- Ensmallening Go binaries by prohibiting comparisons
- Mid-stack inlining in Go
- Inlining optimisations in Go
- go test -v streaming output
- Are large slices more expensive than smaller ones?
- The Zen of Go
2019 21
- Dynamically scoped variables in Go
- Internets of Interest #15: The Queen of the Skies
- Complementary engineering indicators
- Internets of interest #14: UNIX v0
- Internets of interest: Warner Losh on the first ten years of UNIX
- Use internal packages to reduce your public API surface
- Be wary of functions which take several parameters of the same type
- Don’t force allocations on the callers of your API
- Go compiler intrinsics
- Clear is better than clever
- Sydney High Performance Go workshop
- Constant Time
- The three Rs of remote work
- Why bother writing tests at all?
- Prefer table driven tests
- Absolute Unit (test)
- Internets of Interest #12: Testing Michael Feathers’ Patience
- Talk, then code
- You shouldn’t name your variables after their types for the same reason you wouldn’t name your pets “dog” or “cat”
- Eliminate error handling by eliminating errors
- Avoid package names like base, util, or common
2018 21
- Internets of Interest #11: Yesterday’s Computer of Tomorrow: The Xerox Alto
- The office coffee model of concurrent garbage collection
- Internets of Interest #10: Mike Harrison on the Eidophor
- Internets of Interest #9: Jason Scott on the Copyright Fury Road
- Internets of Interest #8: Todd Fernandez on the manufacturing of modern semiconductors
- Internets of Interest #7: Ian Cooper on Test Driven Development
- Internets of Interest #6: Dave Cutler on Dave Cutler
- Internets of Interest #5: Kate Gregory on Simplicity
- Internets of Interest #4: Niall Murphy’s Polemic Against On-Call
- Internets of interest #3: Adam Fletcher on Life of an Airline Flight
- Internets of interest #2: John Ousterhout discusses a Philosophy of Software Design
- Internets of interest #1: Brian Kernighan on the Elements of Programming Style
- Maybe adding generics to Go IS about syntax after all
- Internets of interest #0: The future of Microprocessors
- Using Go modules with Travis CI
- Taking Go modules for a spin
- Slices from the ground up
- How the Go runtime implements maps efficiently (without generics)
- Containers versus Operating Systems
- Go’s hidden #pragmas
- If aligned memory writes are atomic, why do we need the sync/atomic package?
2017 24
- What Have We Learned from the PDP-11?
- Never edit a method, always rewrite it
- Please, vote Yes for marriage equality in Australia
- Why I joined Heptio
- I’m talking about Go at DevFest Siberia 2017
- The HERE IS key
- Context isn’t for cancellation
- Typed nils in Go 2
- Should Go 2.0 support generics?
- How to find out which Go version built your binary
- Simplicity Debt Redux
- Simplicity Debt
- Go, without package scoped variables
- If a map isn’t a reference variable, what is it?
- There is no pass-by-reference in Go
- Understand Go pointers in less than 800 words or your money back
- Why Slack is inappropriate for open source communications
- RC2017/4: Introducing Arudino6502
- Retrochallenge 2017/04: 6502 on Arduino
- Why Go?
- How to write a successful conference proposal
- I’m speaking at GopherChina and GopherCon Singapore
- Context is for cancelation
- The package level logger anti pattern
2016 28
- Never start a goroutine without knowing how it will stop
- Thinking about $GOPATH
- Declaration scopes in Go
- Simulating minicomputers on microcontrollers
- Go 1.8 toolchain improvements
- Do not fear first class functions
- Introducing Go 2.0
- IoT p0wnership
- Go 1.8 performance improvements, one month in
- SOLID Go Design
- Transistor logic fundamentals
- Automatically fetch your project’s dependencies with gb
- Gophers, please tag your releases
- Automatically run your package’s tests with inotifywait
- Stack traces and the errors package
- Test fixtures in Go
- Don’t just check errors, handle them gracefully
- The value of TDD
- Constant errors
- Go 1.7 toolchain improvements
- Threads are a strange abstraction
- Go project contributors by the numbers
- Must be willing to relocate
- Should methods be declared on T or *T
- Suggestions for contributing to an Open Source project
- Investigate your package dependencies with prdeps and Unix
- Unhelpful abstractions
- cgo is not Go
2015 31
- Are Go maps sensitive to data races ?
- How will you be programming in a decade ?
- A whirlwind tour of Go’s runtime environment variables
- Wednesday pop quiz: spot the race
- The Legacy of Go
- Let’s talk about logging
- Programming language markets
- Bootstrapping Go 1.5 on non Intel platforms
- Padding is hard
- Building Go 1.5 on the Raspberry Pi
- Cross compilation with Go 1.5
- Using gb as my every day build tool
- Performance without the event loop
- Why Go and Rust are not competitors
- Listen up!
- gb, a project based build tool for the Go programming language
- Friday pop quiz: the smallest buffer
- Hear me speak about Go performance at OSCON
- Struct composition with Go
- Introducing gb, a project based build tool for the Go programming language
- 2015 is going to be the year of Go
- A parable about practice
- Recruiters, know thy community
- Polyglot travel
- Simplicity and collaboration
- Cross compilation just got a whole lot better in Go 1.5
- Unofficial Go 1.4.2 tarballs now available
- Lost in translation
- Practical public speaking for Nerds
- Thanks Brainman
- Errors and Exceptions, redux
2014 52
- Building an atmega1284p prototype
- Make your own Apple 1 replica
- Inspecting errors
- Unofficial Go 1.4 tarballs now available
- Friday pop quiz: the size of things
- Minimum one liner followup
- Friday pop quiz: minimum one liner
- Retrochallenge 2015/01 entry, reviving an Apple II motherboard
- Five suggestions for setting up a Go project
- Visualising dependencies
- Error handling vs. exceptions redux
- Go, frameworks, and Ludditry
- Simple profiling package moved, updated
- Functional options for friendly APIs
- That trailing comma
- Unofficial Go 1.3.3 ARM tarballs now available
- Using // +build to switch between debug and release builds
- go list, your Swiss army knife
- How to install multiple versions of Go
- Go’s runtime C to Go rewrite, by the numbers
- Go has both make and new functions, what gives ?
- Tinyterm: A silly terminal emulator written in Go
- Arduino SPI woes
- Visualising the Go garbage collector
- Unofficial Go 1.3 ARM tarballs now available
- Paranormal trivia
- Ice cream makers and data races
- That wild ass recruiting idea
- Five things that make Go fast
- What does go build build ?
- On declaring variables
- Go 1.3 linker improvements
- Accidental method value
- Unofficial Go 1.2.2 and 1.3beta1 tarballs for ARM now available
- term: low level serial with a high level interface
- autobench-next updated for Go 1.3
- How to install multiple versions of Go
- Associative commentary follow up
- Associative commentary
- The empty struct
- Thoughts on Go package management six months on
- Channel Axioms
- Pointers in Go
- pdp11 presentation slides
- avr11: performance measurements
- avr11: profiling on the Atmega
- avr11: building an SPI SRAM shield for an Arduino Mega
- avr11: how to add 256 kilobytes of ram to an Arduino
- avr11: simulating minicomputers on microcontrollers
- What did devops mean ?
- Using go test, build and install
- A real serial console for your Raspberry Pi
2013 44
- Caro on LBJ
- Unofficial Go 1.2 tarballs for ARM now available
- The Mythical Man-Month selection bias
- Go 1.2 performance improvements
- A Go client for Joyent Manta
- Benchmarking Go 1.2rc5 vs gccgo
- Evaluation order oddity
- More simple test coverage in Go 1.2
- Stupid Go declaration tricks
- Subcommand handling in Go
- Calling for autobench contributions for Go 1.2
- Installing Ubuntu Precise 12.04 on a Udoo Quad
- How does the go build command work ?
- How to use conditional compilation with the go build tool
- Why I think Go package management is important
- Simple test coverage with Go 1.2
- Two point five ways to access the serial console on your Beaglebone Black
- #golang tweet popularity
- Release candidate 1 tarballs for ARM now available
- Unofficial Go 1.1.2 tarballs for ARM now available
- Using Juju to build gccgo
- How to include C code in your Go package
- Autoworkers of our generation, a response
- Introducing autobench-next
- Go 1.1 on the Cubieboard 2
- An introduction to cross compilation with Go 1.1
- Introducing profile, super simple profiling for Go programs
- Unofficial Go 1.1.1 tarballs for ARM now available
- How to write benchmarks in Go
- Stress test your Go packages
- How to install Go 1.1 on CentOS 5.9
- You don’t need to set GOROOT, really
- Writing table driven tests in Go
- How Go uses Go to build itself
- Why is a Goroutine’s stack infinite ?
- Go 1.1 performance improvements, part 3
- Go 1.1 performance improvements, part 2
- Go 1.1 performance improvements
- Go 1.1 tarballs for linux/arm
- Go and Juju at Canonical slides posted
- Curious Channels
- What is the zero value, and why is it useful?
- Using screen for lazy dot files
- Go, the language for emulators
2012 13
- Testing Go on the Raspberry Pi running FreeBSD
- Andrei Alexandrescu on exceptions
- The Go Programming Language (2009)
- Notes on exploring the compiler flags in the Go compiler suite
- Mikio Hara’s ipv4 package
- Installing Go on the Raspberry Pi
- An introduction to cross compilation with Go
- Another Go at the Next Big Language
- How to decode travel agent speak
- August Go meetup slides
- How the Go language improves expressiveness without sacrificing runtime performance
- Introducing gmx, runtime instrumentation for Go applications
- Why Go gets exceptions right
2011 19
- Three new SSH client features in Go weekly.2011-11-18
- Scratching my own itch, or how to publish multicast DNS records in Go
- OS X has a built in WiFi scanner
- Simple extended attribute support for Go
- Using Clang 2.9 to build Google Go
- Bash trick ‘o the day
- A new take on artificial scarcity
- Nobody rings a bell at the top of the market
- Netgear Stora as an ARM development platform
- Zephyr
- Pivot
- Cthulhu
- Click through rates
- The Whitlam Government’s achievements
- Harbour Bridge, 2011
- ack! and Go source files
- daemontools rpm for CentOS / Redhat
- Frothy
- Holga