After 4 weeks with the Apple M1

I brought my dead 2017 MacBook Pro to an Apple Store exactly 30 days ago. As expected, the internals were highly corroded due to liquid damage. An entire sector of the logic board and the display cables were gone. Luckily, I had just backed up my important projects to an external drive a few weeks before it gave in. I was also told that an out-of-warranty repair would cost 1,299 USD out of pocket.

The Apple employee recommended that I consider a new M1 MacBook Air, which would not only be $50 cheaper than the quoted repair, but would probably also run circles around my old 2017 MacBook Pro in terms of both efficiency and performance, even though it costs nearly half the price. (Spoiler: It does!) So that’s exactly what I did.

I now work on a MacBook Air (M1, 2020) with 8 GB of unified memory and 512 GB of storage (model: MacBook10,1, tech specs). My only gripe is that I miss having 4 USB-C ports. (None of the portable M1 Macs have 4 USB-C ports, even the MacBook Pros.) Everything else is basically perfect.

Physical characteristics

The enclosure feels nice and sturdy. I’m able to lift up the lid and adjust the hinge without disturbing the rest of the machine, which is greatly appreciated. (This isn’t new to the M1 Macs or anything, but I always appreciate this detail.)

The laptop is lighter than I was expecting, and it fits comfortably on my lap. I’d have no problem using this on an airplane or in a car seat. At a weight of 2.8 lb or 1.29 kg, it is easy to carry around, even one-handed. I can also clutch it under one arm fairly easily, and it doesn’t feel like it would slip. While I typically don’t care how thick or heavy my laptop is, the thinness and compactness is admittedly nice sometimes, but this doesn’t come without sacrifice.

When it comes to input, the trackpad is massive and responsive. Apple seems to be really good at getting trackpads right.

Meanwhile, the wretched butterfly keyboard on my 2017 MacBook Pro malfunctioned a whopping 3 times, and every time it broke I had to drive to the Apple Store (which is about an hour away) and have it shipped out to a repair center, meaning I was out of a laptop for a week or two. Luckily, this was covered under a keyboard replacement program, so it was free, but still. Pain.

While I didn’t mind the feeling of the (now dead) butterfly keyboard when it worked, the new “magic keyboard” feels more responsive in comparison. There isn’t a drastic increase in key travel, but it’s there. And I believe this design isn’t prone to death by tiny dust speck or food crumb. Hooray.

Speaking of keyboards… the touch bar on my old MacBook Pro was fun to use and nice to have, but not essential. I mostly used it for the volume slider and accessing secondary actions such as Tapback in Messages, so I can add hearts to all of the messages I receive.

The touch bar’s emoji picker on the was pretty and fun to navigate, but it was actually more convenient for me to use the symbol picker, which let you search by keyword. It also supports tons of Unicode symbols and glyphs, such as punctuation, arrows, and box drawing characters.

The character viewer panel of macOS.
The expanded character viewer.

Apple recently updated the keyboard layout, adding a globe symbol to the fn key that lets you access the character viewer with just one press. Normally it’d appear over the caret as a popover, but you’re free to expand it out into a full-blown panel where you can navigate by category and even customize which categories are shown.

Customizing the character viewer.
There are too many categories to fit into this screenshot.

I/O

A diagram from Apple's website that shows the ports on the machine.

This MacBook Air only has 3 ports—2 USB-C (USB 4, Thunderbolt 3) ports, and a headphone jack. I suppose I should be grateful for the latter.

Even though this laptop can drive a single 6K @ 60Hz display (and accept downstream ports from it), I don’t have one. So, I really miss having 4 USB-C ports. Being able to charge the laptop from either side was useful, and it sucks only having one port free while charging.

(Note: Today’s MacBook Airs never have more than two ports, but none of the M1 MacBook Pros have four ports, either. So this is more of a gripe with the current M1 lineup instead of an issue with this machine in particular.)

Adapters, dongles, hubs, and docking stations can work around these problems, but I often find myself working on battery power, and my portable drive is USB-C already. The internal trackpad and keyboard work just fine for me, so I don’t need to plug in any external peripherals.

Last note: the screen! “Retina”, as Apple calls it. It’s good—2560 by 1600, crisp text, instant scaling and display connection without blanking, decent brightness, True Tone is cool, and I’m unable to perceive a pixel grid. Really missed it.

Performance characteristics

Energy efficiency

I’ve been working on this blog post for the past 2 hours and 40 minutes with the computer unplugged. I have a few iTerm2 tabs open, one of which is running Neovim with 12 buffers loaded and Zola watching the project directory and constantly rebuilding. Safari is open to Twitter, 5 G Suite (Classroom, Slides, Docs, and Forms) tabs, this blog, and Tumblr. I also have Music, Calendar, Messages, and Stickies open.

And right now, Activity Monitor says:

  • Remaining charge: 90%
  • Time remaining: 16:12
  • Time on battery: 2:42

I’d fully expect my old MacBook Pro to be around 60 to 75% battery at this point. There’s no way to know for sure, though. I’m never seeing it again. (Because this machine is so, so, so much better. And because it’s, uh, dead.)

Lately I’ve been working on my Mac app inside of Xcode, which doesn’t hammer the battery at all—I can easily spend all day unplugged and have much to spare by the time it’s 10 PM.

I haven’t worked on my Rust or Scala projects with the machine unplugged yet (I’ve only ran some compile tests), so I don’t know what a day of programming unplugged is like just yet. I’m sure those will demand more from the battery, especially if something like LSP is involved.

Processing speed

This machine is the fastest computer I’ve ever owned. I have never owned a desktop (tower) computer—just laptops. I don’t have much to compare it to, other than my ancient Lenovo laptop (which is incredibly slow) and my iPhone 12 Pro.

Although, I guess it’s fairly appropriate to compare it to the iPhone, seeing as they’re both powered by Apple silicon now. They’re actually much alike now that I think about it… For example, it’s rare for the user interface to snag. In fact, it’s perplexing whenever it does lag, because it almost never does.

As a matter of fact, I can only remember a few times the system slowed:

  • As I was compiling LLVM as part of a rustc build.
  • When I was running Minecraft in the background.
  • As V8 was being compiled as part of a Node.js build.

So… yeah! These things are speedy. No complaints, and there’s really not much else to say. See this TechCrunch article if you haven’t already.

Asymmetric multiprocessing

It’s worth noting that the cores in the Apple M1 are asymmetric—4 cores are designated for efficiency, while the other 4 remain destined for performance.

An Activity Monitor screenshot showing activity on all 8 cores.
The cores on Apple's SoCs are asymmetric.

You’re able to schedule work to be done on a certain core by specifying the priority through Apple’s Grand Central Dispatch framework. This exact same API is used on iOS as well.

Asymmetric cores are probably essential to achieving the impressive battery life this machine has. In particular, I’ve noticed that Time Machine backups and Spotlight indexing are only completed with the efficiency cores, whereas heavy compile jobs are capable of pinning all eight cores at once.

Howard Oakley over at the Eclectic Light Company has also written a bit about this subject as well. (The performance cores outpace an 8-core Intel Xeon W by 10 seconds compressing a Big Sur installer.) Worth checking out if you’re curious.

Instant wake from sleep

Craig Federighi waking a MacBook.
"But first, let's set the mood."

I was honestly a bit unimpressed when it came to this feature at first. Instant wake. So what, right? But it’s actually pretty damn neat. Having to wait a few seconds never killed anybody, but I’m so glad it’s gone now.

Instant wake means that you never notice when the machine is asleep. As soon as you lift the lid it’s on; almost as if it never slept in the first place. Somewhat negligible, but it’s the ultimate momentum preserver.

Passive cooling & temperature

The M1 MacBook Air has no fans and relies on passive cooling. It’s gotten decently hot while compiling code or running Minecraft, but it’s not scalding, and it’s somewhat quick to cool down afterwards.

The power efficiency means that the machine typically runs cooler now, and I’ve coded on it while resting the machine in my lap a bunch of times without any temperature issues.

Usage scenarios

Safari

The M1 is great at web browsing, and I can confidently say that you could get 16–18 hours out of a single charge (or more) if that’s all you did on it. Safari is incredibly optimized and loads websites virtually instantly when cached, and blazing fast (sorry) otherwise.

Because of this, I haven’t bothered to install Chrome, but I did try out Firefox for a bit. It seems fine, but now I have to find alternatives for extensions:

I do miss the more standard extensions but it’s okay for now.

Package management

As recommended by a friend I’ve started to use MacPorts in lieu of Homebrew and ran into minimal problems. The occasional package needs building but everything seems to be working.

Why not Homebrew? MacPorts has some interesting concepts, and I just wanted to try something different for a change.

I’m interested in exploring Nix once aarch64-darwin gets support.

Development

Rust seems to be working just fine with rustup. Compiles are fast.

My Scala project which uses cats, cats-effect, fs2 is fully functional after installing the Azul JDK and getting set up with Coursier and Bloop.

Node.js and npm are working as expected after installation from MacPorts.

And of course, native iOS and macOS development within Xcode is in perfect working order.

Still waiting on Haskell support.

Tests

I didn’t bother running any benchmarks (plenty of others have already done that), but I still wanted some build times and FPS measurements, even if crude.

Minecraft (native)

Minecraft running natively on the M1.

Vanilla Minecraft 1.16.5 within MultiMC is runnable without x86_64 emulation through a performance hack and the aforementioned Azul JDK.

FPS range estimations on battery power, VSync off, FPS uncapped, and render distance set to 16 chunks:

Client Scenario Min. FPS Max. FPS
Vanilla On the ground 120 140
Flying around 60 80
Modded On the ground 120 140
Flying around 80 120

Modding was done with Fabric and includes these optimization mods: Hydrogen, Sodium, Lithium, and Phosphor.

More than enough for Hypixel Bedwars. In fact, I sometimes get around 200 FPS while the laptop is plugged in and logged into a lobby.

Rust project

Cold compile times for my nontrivial Rust project (involves parsing JavaScript, emitting JSON, making network requests) compared to my old machine (dual-core Core i3):

Machine Debug (cold) Release (cold) Notes
M1 MacBook Air 00:33 00:50 Battery power
Ancient machine 02:57 04:49 Plugged in

Nothing surprising here. The MBA gets a bit warm on the lap but is no sweat. Compile-edit cycles are also rapid.

rustc compile

The machine was able to build rustc 1.54.0-dev stage1 (80af6b091f) in 20 minutes and 30 seconds. This includes a LLVM 12 build.

Commands to compile:

$ git clone git@github.com:rust-lang/rust.git
$ git checkout 80af6b091f
$ cp config.toml.example config.toml
$ ./x.py build

I probably missed some switches or flags to flick, but good enough?

Node.js (V8) compile

I tried out the macOS Monterey beta for a short while. This meant having to build all of my packages from source, as no binaries were available. This included Node.js, which to my understanding means building V8 from source. (V8 is Chrome’s JavaScript engine.)

This completed in about 10 minutes, during which all 8 cores were pinned and the machine got fairly hot. (I didn’t explicitly time this one, so this may be wildly off, but I’d figure I’d include it.)

Other notes & observations

Login screen with FileVault

Something that bugged me about my old MacBook Pro is that my user profile picture would always appear blurry on the login screen. This had to do with disk encryption—the boot process needed my password before unlocking the boot disk was possible, and I’m guessing they could only afford to copy over a highly compressed image over into the unencrypted portion. Dunno.

Apple now controls the entire boot chain on M1 Macs (documented here) and this has somehow allowed them to (partially) boot macOS enough to ask me for my password without a blurry profile icon.

By the way, it takes about 19 seconds to reach the login screen from the chime, and an extra 13 seconds to log in and reach the desktop. Fun fact: the system volume is cryptographically sealed, and said seal is verified during boot.

Rosetta 2

x86_64 emulation is barely noticeable and only takes a click to install (you get a prompt when launching an Intel app). Ableton Live 11 works fine, and so does Discord.

Accessing an Intel shell is easy:

$ arch -x86_64 sh

To determine whether an app is native or Intel, open the “Get Info” panel in Finder:

The Get Info panel in Finder shows details of an application.
Accessible with ⌘+I.

I’ve experienced zero problems.

1TR & DFU

Booting into recovery or other special boot modes on previous Macs required inputting precise key combinations. On M1 Macs, this has been unified into a single operation: hold down the power button, and you will be presented with graphical options.

Another security fun fact: this is referred to as “1TR”, or “1 True Recovery”. Downgrading the security or boot policy of the machine is only possible within 1TR; invoking a boot into recovery from within macOS itself does not allow changes to be made.

Within 1TR, the boot policy can be edited with the user-friendly Startup Security Utility or the dangerous bputil(1). System Integrity Protection, system volume signing, and other security-related knobs can similarly be flicked with the familiar csrutil(1).

The Startup Security Utility.
Image from Apple.

With M1, DFU mode has also come to Macs as well, previously only existing on iOS devices. DFU mode is an incredibly low-level state that is baked into the BootROM of the machine, accessible even if the normal bootloader and recovery mode aren’t. The folks working on Asahi Linux have documented this in detail.

Conclusion

To nobody’s surprise at this point, Apple’s M1 is superfast and it’s Pretty Cool how much power and efficiency can be packed into a fanless 13" laptop. And with a second batch of laptops and people working to get Linux on this thing, the future is bound to be interesting.