These are the results from running Xcode on a non-trivial open source project using various Macs. The goal is to give developers a relative idea of how each computer model compares to one another. Read the specifics and contributing sections for more info.
🖥 | Computer Model | CPU | RAM | Fresh Build Time | Incremental Build Time | Xcode Version | Date & Commit Hash | New Build System? |
---|---|---|---|---|---|---|---|---|
💻 | MacBook Pro Retina, 13", Early 2015 |
2.7 GHz i5 | 8 GB | 2:25 | 0:31 | 2018-05-19 (commit) | ❌ | |
💻 | MacBook Pro Retina, 13", Early 2015 |
2.7 GHz i5 | 8 GB | 1:12 | 0:18 | 2018-05-19 (commit) | ✔️ | |
💻 | MacBook Pro Retina, 15", Mid 2018 |
2.9 GHz i9 | 32 GB | 0:32 | 0:04 | 2018-05-19 (commit) | ✔️ | |
⌨️ | Custom PC Early 2018 |
i7-8700K 4.70+ GHz | 32 GB | 0:19 | 0:07 | 2018-03-11 (commit) | ✔️ | |
⌨️ | Custom PC Early 2016 |
i7-6700k 4.5 GHz | 32 GB | 0:23 | 0:07 | 9.4.1 | 2018-05-19 (commit) | ✔️ |
💻 | MacBook Pro Retina, 13", Mid 2018 |
2.7 GHz i7-8559U | 16 GB | 0:27 | 0:09 | 9.4.1 | 2018-05-19 (commit) | ✔️ |
⌨️ | Custom PC Early 2018 |
i7-7700k 4.5 GHz | 16 GB | 0:35 | 0:05 | 2018-03-10 | ✔️ | |
⌨️ | Custom PC Early 2018 |
i7-8700K 4.70+ GHz | 32 GB | 0:36 | 0:07 | 2018-02-19 (commit) | ❌ | |
⌨️ | Custom PC Early 2018 |
i7-7700k 4.5 GHz | 16 GB | 0:48 | 0:07 | 2018-03-10 | ❌ | |
⌨️ | Custom PC Late 2015 |
i7-4790k 4.0 GHz | 32 GB | 0:40 | 0:07 | 2018-02-22 (commit) | ❌ | |
🖥 | iMac Pro 10 Core, Late 2017 |
3 GHz Intel Xeon W | 64 GB | 0:41 | 0:07 | 2017-12-28 | ❌ | |
🖥 | iMac Pro 18 Core, Late 2017 |
2.3 GHz Intel Xeon W | 128 GB | 0:47 | 0:07 | 2018-03-07 (commit) | ❌ | |
🖥 | iMac 27" 5K 1TB SSD, Mid 2017 |
4,2 GHz i7 | 40 GB | 0:49 | 0:08 | 2018-01-18 | ❌ | |
💻 | MacBook Pro Retina, 15", 2017 |
2.9 GHz i7 | 16 GB | 0:49 | 0:16 | 2017-10-09 | ✔️ | |
💻 | MacBook Pro Retina, 15", 2017 |
2.9 GHz i7 | 16 GB | 0:50 | 0:15 | 2017-10-09 | ❌ | |
💻 | MacBook Pro Retina, 15", 2016 |
2.9 GHz i7 | 16 GB | 1:04 | 0:09 | 9.4.1 | 2018-07-18 (commit) | ✔️ |
💻 | MacBook Pro Retina, 15", 2016 |
2.9 GHz i7 | 16 GB | 1:06 | 0:10 | 9.4.1 | 2018-07-18 (commit) | ❌ |
💻 | MacBook Pro Retina, 15", 2015 |
2.5 GHz i7 | 16 GB | 0:51 | 0:09 | 9.2 | 2018-03-02 (commit) | ✔️ |
🖥 | MacPro Late 2013 | 2.7 GHz 12core Intel Xeon E5 | 64 GB | 0:54 | 0:10 | 2018-03-07 (commit) | ❌ | |
🖥 | iMac 27" 256GB SSD, Late 2013 |
3.2 GHz i5 | 24 GB | 0:56 | 0:10 | 9.2 | 2018-03-02 (commit) | ✔️ |
💻 | MacBook Pro Retina, 15", Mid 2012 |
2.6 GHz i7-3720QM | 16 GB | 1:04 | 0:13 | 9.4.1 | 2018-05-19 (commit) | ✔️ |
💻 | MacBook Pro Retina, 15", Late 2013 |
2.6 GHz i7 | 16 GB | 1:09 | 0:12 | 2018-02-28 | ✔️ | |
💻 | MacBook Pro Retina, 15", 2015 |
2.8 GHz i7 | 16 GB | 1:17 | 0:12 | 2018-01-02 | ❌ | |
💻 | MacBook Pro Retina, 15", 2015 |
2.5 GHz i7 | 16 GB | 1:20 | 0:09 | 9.2 | 2018-03-02 (commit) | ❌ |
🖥 | iMac 27" 256GB SSD, Late 2013 |
3.2 GHz i5 | 24 GB | 1:27 | 0:10 | 9.2 | 2018-03-02 (commit) | ❌ |
⌨️ | Custom Laptop Mid 2018 |
i5-8250u 3.4 GHz | 16 GB | 1:58 | 0:10 | 9.3 | 2018-05-11 | ❌ |
💻 | MacBook Pro Retina, 13", 2014 |
2.6 GHz i5 | 8 GB | 2:30 | 0:23 | 2018-01-04 | ❌ | |
Mac Mini Mid 2012, 512 SSD |
2.3 GHz Quad-Core i7 | 16 GB | 1:32 | 0:18 | 2017-10-20 | ❌ | ||
💻 | MacBook Pro Retina, 15", 2017 |
2.8 GHz i7 | 16 GB | 1:50 | 0:14 | ❌ | ||
🖥 | iMac 27" 120GB SSD, Mid 2010 |
2.93 GHz i7 | 8 GB | 2:05 | 0:16 | 9.3 | 2018-03-21 | ❌ |
💻 | MacBook Retina, 15", Mid 2012 |
2.6 GHz i7 | 8 GB | 2:26 | 0:23 | ❌ | ||
💻 | MacBook Pro 13", Mid 2012 |
2.9 GHz i7 | 8 GB | 2:30 | 0:23 | ❌ | ||
Mac Pro Flash Storage, Late 2013 |
3.7 GHz 4-Core Xeon E5 | 32 GB | 1:15 | 0:10 | 9.4.1 | 2018-06-20 (commit) | ❌ | |
Mac Pro Flash Storage, Late 2013 |
3.7 GHz 4-Core Xeon E5 | 32 GB | 0:35 | 0:11 | 9.4.1 | 2018-06-20 (commit) | ✔️ |
For the test, I decided to use an app that I actually work on: eidolon. Unlike most iOS apps, the project is stable and not under active development, so it's a prime candidate for accurate-ish benchmarking.
For "fresh" builds, I cleaned the build folder (⌘⇧K) repeatedly until it worked with no permissions problems. Then I sat and waited for Xcode to index the project. I also made sure the simulator was closed, so these times include booting the simulator and launching the app. Then I hit ⌘R and start a timer, only ending it when the app had fully launched.
"Incremental" builds represent a more common use case: changing one file and recompiling with the simulator already running. I added print("hello!")
to application(: didFinishLaunchingWithOptions:)
and hit ⌘R, timing the time it took for the app to launch.
I repeated each test a few times and took their average times.
It would be super-cool if we could perform the above tests on a variety of machines and consolidate the results here. You can follow the instructions to download the code and the project dependencies, and send a pull request adding your own results. I'd super-appreciate it! 🙇
Please note that this project is released with a Contributor Code of Conduct. By participating in this project, you agree to abide by its terms.
This work is licensed under a Creative Commons Attribution 4.0 International License.