Fractally uses an efficient threading model, to take advantage of the many CPU cores that are available on modern devices. The app also takes advantage of vector instructions, using the largest vectors available on the device (128, 256 or 512 bit vectors.)
Depending on the zoom level and maximum iteration count, the app may choose to use single or double precision floating point (32 or 64 bit.) Single precision is faster, double precision is required for higher iteration counts and higher zoom levels.
The following performance table records the maximum number of iterations per second on each device. These values can be seen by showing the metrics, by tapping on the Show Metrics menu item.
For example:
At the end of the first line in the metrics view, there will either be
(s)
or (d)
which indicates if the iterations per second value applies
to single precision (32 bit) floating point, or double precision (64 bit)
floating point.
An iteration is one cycle through the Mandelbrot equation, along with the bookkeeping required to increment the iteration counts and determine when each point escapes the bounded complex number plane. Each iteration involves many floating point calculations.
The app has been tested on the following devices:
single | double | |||
---|---|---|---|---|
Model | rate | rate | Processor | Vector, credit |
2019 iMac | 29,360 | 14,149 | 6 core i3-8500 | 256 bit (AVX-2), by Gregory H. |
2020 MacBookPro 13” | 24,010 | 11,090 | quad core i5 | 512 bit (AVX-512) |
2021 iMac M1 | 19,300 | 10,100 | 8 core M1 | 128 bit, apple native. |
2021 iMac M1 | 12,850 | 5,280 | 8 core M1 | 128 bit, Rosetta translation. |
2022 iPhone SE2 | 11,650 | 5,710 | 6 core A13 | 128 bit (NEON) |
2017 MacbookPro 13” | 9,220 | 4,860 | dual core i5 | 256 bit (AVX-2) |
2018 iPhone XR | 5,695 | 2,723 | 6 core A12 | 128 bit, by Gregory H. |
2012 MacbookPro 13” | 4,251 | 2,553 | dual core i5 | 256 bit (AVX-1) |
2016 iPhone SE | 2,623 | 1,318 | dual core A9 | 128 bit (NEON) |
2017 5th gen iPad | 2,547 | 1,284 | dual core A9 | 128 bit (NEON) |
(The iteration rates above are in millions of iterations per second.)
The 2020 13” MacBookPro is doing over 20 billion iterations per second! Even an old iPhone, from 2016, is able to perform over two billion iterations per second. Its astounding how fast our devices have become.
Showing both the Julia and Mandelbrot sets.
The most demanding task you can ask of a Mandelbrot / Julia set viewer, such as Fractally, is to view both at the same time. In Fractally, as you scroll around the Mandelbrot set, there is a new seed value used to generate a new Julia set. Each Julia set calculation starts all over, there is nothing saved from the earlier calculation. Updating the Julia set when the Mandelbrot set scrolls requires raw brute force speed.
Zooming
As you zoom in and out, Fractally will adaptively adjust the quality of the images produced in order to maintain a high frame rate. On slower devices, the quality of a zoomed image will appear pixelated. This resolves as soon as you pause zooming. On faster devices, the quality of the zoomed images will be higher. On my 2020 13” MBP the zooms are often generated at full retina resolution, in real time.
I will be curious to hear about the experiences of others as they run on the newer Apple Silicon devices (A14, A14X, etc.)
Doing your own performance test.
If you measure the performance on your own device, please let me know what the results are.
When doing this test I only show the Mandelbrot set. On the Mac, make the app full screen (with no menu bar being shown.) Zoom fully out, and then zoom into the interior of the set so that the entire screen is occupied with inside pixels. Set the maximum iteration count to 400. Then zoom a little in, pause, a little out, pause, a little in, pause, a little out, etc. Keep doing these small zooms until the performance metrics number appears to stop changing.
Do the test for both single and double precision.