The MemoryBenchmark.ino
was compiled with each FEATURE_*
and the flash
memory and static RAM sizes were recorded. The FEATURE_BASELINE
selection is
the baseline, and its memory usage numbers are subtracted from the subsequent
FEATURE_*
memory usage.
Version: AceTime v2.3.0
DO NOT EDIT: This file was auto-generated using make README.md
.
To regenerate this README.md:
$ make clean_benchmarks
$ make benchmarks
$ make README.md
The make benchmarks
target uses collect.sh
script which calls auniter.sh
(https://github.com/bxparks/AUniter) to invoke the Arduino IDE programmatically.
It produces a *.txt
file with the flash and ram usage information (e.g.
nano.txt
). It now takes about 16 minutes to generate the *.txt
files on my
quad-core Intel Core i7-3840QM CPU @ 2.80GHz laptop.
The make README.md
command calls the generated_readme.py
Python script which
generates this README.md
file. The ASCII tables below are generated by the
generate_table.awk
script, which takes each *.txt
file and converts it to an
ASCII table.
v1.3:
- The
BasicZoneManager
andExtendedZoneManager
classes were unified under a new parent interfaceZoneManager
. This seems to have caused the flash size to increase by around 1200 bytes on the AVR processors (Nano, Pro Micro), about 500 bytes on a SAMD, about 800 bytes on a ESP8266, 100 bytes on a ESP32, and 1400 bytes on a Teensy 3.2. The 8-bit processors suffer the most flash size increase proportional to their limited 32kB limit. - Adding the
ZoneManager
interface simplifies a lot of the complexity with saving and restoring time zones using theTimeZoneData
object, and I think it is worth the extra cost of flash size. The mitigating factor is that applications targetted towards 8-bit processors will normally have fixed number of timezones at compile time, so they can avoid using aZoneManager
, and avoid this penalty in flash size.
v1.4.1+:
- Removed the
ZoneInfo::transitionBufSize
field from theZoneInfo
struct, which saves 1 byte on 8-bit processors (none on 32-bit processors due to 4-byte alignment). We save 266 bytes forBasicZoneManager
and 386 bytes forExtendedZoneManager
when all the zones are loaded into the zone registry. - Incorporated zoneName compression causes flash/ram usage to increase by
~250/120 bytes when using only 1-2 zones, but decreases flash consumption by
1200-2400 bytes when all the zones are loaded into the
ZoneManager
.
v1.5+:
- Changing
ZoneProcessorCache::getType()
from avirtual
to a non-virtual method saves 250-350 bytes of flash memory when using aBasicZoneManager
or anExtendedZoneManager
on an 8-bit AVR processor. Unexpectedly, the flash memory consumption increases slightly (~0-50 bytes) for some ARM processors and the ESP32. Since those processors have far more flash memory, this seems like a good tradeoff. - Changing
BasicZoneProcessor
andExtendedZoneProcessor
to be subclasses of the templatizedBasicZoneProcessorTemplate
andExtendedZoneProcessorTemplate
classes causes reduction of flash consumption by 250-400 bytes for 32-bit processors. Don't know why. (Very little difference for 8-bit AVR). - Adding a
ZoneInfoStore
layer of indirection (to support more complex ZoneProcessors and Brokers) causes flash memory to go up by 100-200 bytes.
v1.6:
- Added support for
LinkRegistry
toBasicZoneManager
andExtendedZoneManager
. This increases the flash memory usage by 150-500 bytes when using one of these classes due to the code required byLinkRegistrar
. This extra cost is incurred even if theLinkRegistry
is set to 0 elements. EachLinkEntry
consumes 8 bytes (2 xuint32_t
). So azonedb::kLinkRegistry
with 183 elements uses 1464 extra bytes of flash; azonedbx::kLinkRegistry
with 207 elements uses 1656 extra bytes.
v1.7:
- The virtual destructor on the
Clock
base class removed. This reduced the flash usage by 618 bytes on AVR processors , 328 bytes on the SAMD21, but only 50-60 bytes on other 32-bit processors. - The various
printShortNameTo()
orprintShortTo()
methods changed to replace the underscore in the zone names (e.g.Los_Angeles
) with spaces (e.g.Los Angeles
) to be more human friendly. This made little difference in the flash memory consumption, except on the ESP32 where it increased by 200-300 bytes.
v1.7.2
- The
SystemClock::clockMillis()
is now non-virtual, using compile-time polymorphism through C++ template, and incorporating the same techniques from AceRoutine v1.3. Saves about 20-40 bytes of flash.
v1.7.5:
ExtendedZoneProcessor.compareTransitionToMatch()
was modified to detect an exact equality between aTransition
and itsMatchingEra
if any of the 3 time stamp versions ('w', 's', 'u') are equal. Adds about 120-150 bytes of flash on 8-bit and 32-bit processors. But removingoriginalTransitionTime
fromTransition
decreases flash usage by about 20 bytes.- Upgrade ESP8266 Boards from 2.7.4 to 3.0.2. Flash consumption increases by 3-5 kB across the board.
- Upgrade Teensyduino from 1.54 to 1.55. Add memory consumed by
malloc()
andfree()
when using classes with virtual methods into baseline MemoryBenchmark, reducing the actual memory usage of various features by ~3kB.
v1.8.0:
- Move Clock and SystemClock benchmarks into AceTimeClock v1.0.0.
- Extract thin links from BasicZoneManager and ExtendedZoneManager into
new BasicLinkManager and ExtendedLinkManager classes.
- Saves 200-500 bytes of flash for BasicZoneManager and ExtendedZoneManager.
- Applications can decide whether to use thin links through the LinkManager
(~2000 flash bytes for AVR) or use fat links through the
kZoneAndLinkRegistry
(~5000 flash bytes for AVR).
- Create various test objects as global variables instead of stack variables to get a more accurate measurement of their static memory consumption.
v1.9.0:
- Reduce flash usage of
BasicZoneManager
andExtendedZoneManager
by 1100-1300 bytes on AVR processors:- Extract
BasicZoneProcessorCache
andExtendedZoneProcessorCache
out ofBasicZoneManager
andExtendedZoneManager
, making them non-templatized. - Remove all
virtual
methods fromZoneManager
, making the ZoneManager hierarchy non-polymorphic. - Looks like I am reverting some of the changes made in v1.3 when I created
the
ZoneManager
interface.
- Extract
- Reduce flash usage of
BasicLinkManager
andExtendedLinkManager
by 68 bytes on AVR processors by removing purevirtual
methods onLinkManager
base class. - Increase flash usage by 34 bytes on AVR processors due to slight refactoring
of
getHighWater()
withgetAllocSize()
. Only 4-8 bytes increase on 32-bit processors.
v1.10.0:
- Remove support for SAMD21 boards.
- Arduino IDE 1.8.19 with SparkFun SAMD 1.8.6 can no longer upload binaries to these boards. Something about bossac 1.7.0 not found.
- Add memory consumption benchmarks for
ZoneSorterByName
andZoneSorterByOffsetAndName
forBasicZoneManager
andExtendedZoneManager
.- AVR: 180-530 bytes of flash
- 32-bit: 120-600 bytes of flash
- Upgrade tool chain:
- Arduino IDE from 1.8.13 to 1.8.19
- Arduino AVR from 1.8.3 to 1.8.4
- STM32duino from 2.0.0 to 2.2.0
- ESP32 from 1.0.6 to 2.0.2
- Teensyduino from 1.55 to 1.56
- Add support for
fold
parameter inLocalDateTime
,OffsetDateTime
,ZonedDateTime
, andExtendedZoneProcessor
. Increases flash usage:- AVR:
- ~600 bytes, in
ExtendedZoneProcessor
for additional search logic, - ~150 bytes,
BasicZoneProcessor
, to carry along thefold
parameter
- ~600 bytes, in
- most 32-bit: 400-600 bytes
- Teensy: 1300 bytes (no idea why)
- AVR:
v1.11.0
- Upgrade ZoneInfo database so that Links are symbolic links to Zones, instead
of hard links to Zones.
- Allows Links to know whether they are links.
- Allows extraction of the zoneId and zoneNames of the target Zone.
- AVR: Increases flash consumption by ~270 bytes.
- STM32: Increases flash by 120-150 bytes.
- ESP8266: Increases flash by 250-300 bytes.
- ESP32: Increases flash by ~190 bytes.
- Teensy 3.2: Increase flash by 450-1300 bytes.
v1.11.1
- Change
ZoneInfoBroker::targetZoneInfo()
method to return aZoneInfoBroker
instead of rawZoneInfo*
pointer.- Increases flash usage by 4-16 bytes for the most part.
v1.11.5
- Upgrade tool chain
- Arduino CLI from 0.20.2 to 0.27.1
- Arduino AVR Boards from 1.8.4 to 1.8.5
- STM32duino from 2.2.0 to 2.3.0
- ESP32 Boards from 2.0.2 to 2.0.5
- Teensyduino from 1.56 to 1.57
- Upgrade TZDB from 2022b to 2022d
v2.0
- Use
int16_t
year fields. - Implement adjustable epoch year.
- Upgrade to TZDB 2022f.
- AVR:
- BasicZoneManager increases ~200 bytes
- ExtendedZoneManager increases ~500 bytes
zonedb
increases ~1.5 kiBzonedbx
increases ~3 kiB
- ESP8266
- BasicZoneManager increases ~50 bytes
- ExtendedZoneManager increases ~150 bytes
zonedb
increases ~300 byteszonedbx
increases ~1.5 kiB
v2.0.1
- Upgrade to TZDB 2022g.
- Incorporate
ZonedExtra
to replace variousTimeZone
methods.
v2.1.0
- Remove
LinkManager
andLinkRegistry
. - Unify links, adding an additional
targetInfo
field inZoneInfo
.- Increases flash by ~1kB on 8-bit and ~2kB on 32-bit for ~600 zones.
v2.1.1+
- Simplify ZoneRule.letter handling to use ZoneRule.letterIndex for all letters,
not just ones over 1 character long. On 8-bit AVR:
- BasicZoneProcessor
- Increases flash consumption for 1-2 zones by ~200 bytes.
- No change for the full TZ database.
- ExtendedZoneProcessor
- No change for 1-2 zones.
- Decreases flash consumption by ~300 bytes for full TZ database.
- BasicZoneProcessor
v2.2.0
- Upgrade tool chain
- Arduino AVR from 1.8.5 to 1.8.6
- STM32duino from 2.3.0 to 2.4.0
- ESP8266 from 3.0.2 to 3.1.2 failed, reverted back to 3.0.2
- ESP32 from 2.0.5 to 2.0.7
- Add support for Seeed XIAO SAMD21
- Using Seeeduino SAMD Boards 1.8.3
- Upgrade to TZDB 2023b
v2.2.2
- Upgrade to TZDB 2023c
v2.2.3
- Add support for Adafruit ItsyBitsy M4
- Using Adafruit SAMD Boards 1.7.11
- Remove Teensy 3.2
- Nearing end of life. Moved to Tier 2 (should work).
- Upgrade tool chain
- Seeeduino SAMD Boards 1.8.4
- STM32duino Boards 2.5.0
- ESP32 Boards 2.0.9
v2.3.0
- Implement 1-second resolution in ExtendedZoneProcessor (decoupled from
zonedbx storage format).
- Increases flash usage by ~1kB on 8-bit processors, but only 0-100 bytes on 32-bit processors.
- Enables it to be also used as the CompleteZoneProcessor class.
- Implement CompleteZoneProcessor as a specialization of ExtendedZoneProcessor.
- Enables the creation of
zonedbc
database which contains all TZDB timezones, for all years going back to 1844, the earliest transition in the TZDB. - The flash consumption of zonedbc is roughly 2X of zonedbx.
- Enables the creation of
- Revert
zonedb
to use 8-bit year fields.- Increases flash memory consumption for BasicZoneManager w/ 1 zone by around 150 bytes.
- Decreases flash memory cosumption for BasicZoneManager w/ all timezones by 800-900 bytes.
- Revert
zonedbx
to use 8-bit year fields.- Increase flash memory consumption of ExtendedZoneManager w/ 1 zone by around 220 bytes.
- Decreases flash memory cosumption for ExtendedZoneManager w/ all timezones by ~2000 bytes.
- Move ZoneContext and its string arrays into PROGMEM.
- Reduces RAM usage by 150-200 bytes on AVR and ESP8266 processors.
- Merge
createAbbreviation()
of BasicZoneProcessor and ExtendedZoneProcessorBasicZoneProcessor
: Slight (30-60 bytes) increase in flash memory, no change in RAM usage.ExtendedZoneProcessor
: Slight (30-60 bytes) increase in flash memory. But saves ~16 bytes of RAM for 8-bit, ~64 bytes of RAM for 32-bit.
- Support multi-character
ZoneRule.letter
field- Enables
Africa/Windhoek
andAmerica/Belize
in thezonedb
database used withBasicZoneProcessor
. - Increases flash memory for
zonedb
by ~150 bytes on 8-bit, ~200 on 32-bit processors.
- Enables
- [1] Delta flash and ram consumption for
Basic ZoneSorterByName
andBasic ZoneSorterByOffsetAndName
are calculated by subtracting theBasicZoneManager (1 zone)
numbers, to isolate the memory consumption of just the sorter classes. - [2] Delta flash and ram consumption for
Extended ZoneSorterByName
andExtended ZoneSorterByOffsetAndName
are calculated by subtracting theExtendedZoneManager (1 zone)
numbers, to isolate the memory consumption of just the sorter classes. - [3] Delta flash and ram consumption for
Complete ZoneSorterByName
andComplete ZoneSorterByOffsetAndName
are calculated by subtracting theCompleteZoneManager (1 zone)
numbers, to isolate the memory consumption of just the sorter classes. - An entry of
-1
indicates that the memory usage exceeded the maximum of the microcontroller and the compiler did not generate the desired information.
- 16MHz ATmega328P
- Arduino IDE 1.8.19, Arduino CLI 0.33.0
- Arduino AVR Boards 1.8.6
+----------------------------------------------------------------------+
| Functionality | flash/ ram | delta |
|----------------------------------------+--------------+--------------|
| baseline | 474/ 11 | 0/ 0 |
|----------------------------------------+--------------+--------------|
| LocalDateTime | 1108/ 21 | 634/ 10 |
| ZonedDateTime | 1444/ 30 | 970/ 19 |
| Manual ZoneManager | 1406/ 13 | 932/ 2 |
|----------------------------------------+--------------+--------------|
| Basic TimeZone (1 zone) | 7624/ 208 | 7150/ 197 |
| Basic TimeZone (2 zones) | 8170/ 357 | 7696/ 346 |
| BasicZoneManager (1 zone) | 7834/ 219 | 7360/ 208 |
| BasicZoneManager (all zones) | 19686/ 599 | 19212/ 588 |
| BasicZoneManager (all zones+links) | 25066/ 599 | 24592/ 588 |
|----------------------------------------+--------------+--------------|
| Basic ZoneSorterByName [1] | 8608/ 221 | 774/ 2 |
| Basic ZoneSorterByOffsetAndName [1] | 8740/ 221 | 906/ 2 |
|----------------------------------------+--------------+--------------|
| Extended TimeZone (1 zone) | 11326/ 623 | 10852/ 612 |
| Extended TimeZone (2 zones) | 11924/ 1187 | 11450/ 1176 |
| ExtendedZoneManager (1 zone) | 11506/ 629 | 11032/ 618 |
| ExtendedZoneManager (all zones) | 34508/ 1111 | 34034/ 1100 |
| ExtendedZoneManager (all zones+links) | 40540/ 1111 | 40066/ 1100 |
|----------------------------------------+--------------+--------------|
| Extended ZoneSorterByName [2] | 12276/ 631 | 770/ 2 |
| Extended ZoneSorterByOffsetAndName [2] | 12360/ 631 | 854/ 2 |
|----------------------------------------+--------------+--------------|
| Complete TimeZone (1 zone) | -1/ -1 | -1/ -1 |
| Complete TimeZone (2 zones) | -1/ -1 | -1/ -1 |
| CompleteZoneManager (1 zone) | -1/ -1 | -1/ -1 |
| CompleteZoneManager (all zones) | -1/ -1 | -1/ -1 |
| CompleteZoneManager (all zones+links) | -1/ -1 | -1/ -1 |
|----------------------------------------+--------------+--------------|
| Complete ZoneSorterByName [3] | -1/ -1 | 0/ 0 |
| Complete ZoneSorterByOffsetAndName [3] | -1/ -1 | 0/ 0 |
+---------------------------------------------------------------------+
- 16 MHz ATmega32U4
- Arduino IDE 1.8.19, Arduino CLI 0.33.0
- SparkFun AVR Boards 1.1.13
+----------------------------------------------------------------------+
| Functionality | flash/ ram | delta |
|----------------------------------------+--------------+--------------|
| baseline | 3470/ 153 | 0/ 0 |
|----------------------------------------+--------------+--------------|
| LocalDateTime | 4080/ 161 | 610/ 8 |
| ZonedDateTime | 4416/ 170 | 946/ 17 |
| Manual ZoneManager | 4400/ 153 | 930/ 0 |
|----------------------------------------+--------------+--------------|
| Basic TimeZone (1 zone) | 10596/ 348 | 7126/ 195 |
| Basic TimeZone (2 zones) | 11124/ 495 | 7654/ 342 |
| BasicZoneManager (1 zone) | 10806/ 359 | 7336/ 206 |
| BasicZoneManager (all zones) | 22656/ 737 | 19186/ 584 |
| BasicZoneManager (all zones+links) | 28036/ 737 | 24566/ 584 |
|----------------------------------------+--------------+--------------|
| Basic ZoneSorterByName [1] | 11580/ 361 | 774/ 2 |
| Basic ZoneSorterByOffsetAndName [1] | 11712/ 361 | 906/ 2 |
|----------------------------------------+--------------+--------------|
| Extended TimeZone (1 zone) | 14282/ 763 | 10812/ 610 |
| Extended TimeZone (2 zones) | 14878/ 1325 | 11408/ 1172 |
| ExtendedZoneManager (1 zone) | 14462/ 769 | 10992/ 616 |
| ExtendedZoneManager (all zones) | 37478/ 1249 | 34008/ 1096 |
| ExtendedZoneManager (all zones+links) | 43510/ 1249 | 40040/ 1096 |
|----------------------------------------+--------------+--------------|
| Extended ZoneSorterByName [2] | 15232/ 771 | 770/ 2 |
| Extended ZoneSorterByOffsetAndName [2] | 15316/ 771 | 854/ 2 |
|----------------------------------------+--------------+--------------|
| Complete TimeZone (1 zone) | -1/ -1 | -1/ -1 |
| Complete TimeZone (2 zones) | -1/ -1 | -1/ -1 |
| CompleteZoneManager (1 zone) | -1/ -1 | -1/ -1 |
| CompleteZoneManager (all zones) | -1/ -1 | -1/ -1 |
| CompleteZoneManager (all zones+links) | -1/ -1 | -1/ -1 |
|----------------------------------------+--------------+--------------|
| Complete ZoneSorterByName [3] | -1/ -1 | 0/ 0 |
| Complete ZoneSorterByOffsetAndName [3] | -1/ -1 | 0/ 0 |
+---------------------------------------------------------------------+
- SAMD21, 48 MHz ARM Cortex-M0+
- Arduino IDE 1.8.19, Arduino CLI 0.33.0
- Seeeduino SAMD Boards 1.8.4
+----------------------------------------------------------------------+
| Functionality | flash/ ram | delta |
|----------------------------------------+--------------+--------------|
| baseline | 34068/ 0 | 0/ 0 |
|----------------------------------------+--------------+--------------|
| LocalDateTime | 34372/ 0 | 304/ 0 |
| ZonedDateTime | 35116/ 0 | 1048/ 0 |
| Manual ZoneManager | 35100/ 0 | 1032/ 0 |
|----------------------------------------+--------------+--------------|
| Basic TimeZone (1 zone) | 38916/ 0 | 4848/ 0 |
| Basic TimeZone (2 zones) | 39276/ 0 | 5208/ 0 |
| BasicZoneManager (1 zone) | 39020/ 0 | 4952/ 0 |
| BasicZoneManager (all zones) | 54948/ 0 | 20880/ 0 |
| BasicZoneManager (all zones+links) | 63196/ 0 | 29128/ 0 |
|----------------------------------------+--------------+--------------|
| Basic ZoneSorterByName [1] | 39508/ 0 | 488/ 0 |
| Basic ZoneSorterByOffsetAndName [1] | 39572/ 0 | 552/ 0 |
|----------------------------------------+--------------+--------------|
| Extended TimeZone (1 zone) | 41028/ 0 | 6960/ 0 |
| Extended TimeZone (2 zones) | 41396/ 0 | 7328/ 0 |
| ExtendedZoneManager (1 zone) | 41132/ 0 | 7064/ 0 |
| ExtendedZoneManager (all zones) | 71796/ 0 | 37728/ 0 |
| ExtendedZoneManager (all zones+links) | 81020/ 0 | 46952/ 0 |
|----------------------------------------+--------------+--------------|
| Extended ZoneSorterByName [2] | 41620/ 0 | 488/ 0 |
| Extended ZoneSorterByOffsetAndName [2] | 41684/ 0 | 552/ 0 |
|----------------------------------------+--------------+--------------|
| Complete TimeZone (1 zone) | 41548/ 0 | 7480/ 0 |
| Complete TimeZone (2 zones) | 42780/ 0 | 8712/ 0 |
| CompleteZoneManager (1 zone) | 41652/ 0 | 7584/ 0 |
| CompleteZoneManager (all zones) | 121348/ 0 | 87280/ 0 |
| CompleteZoneManager (all zones+links) | 130580/ 0 | 96512/ 0 |
|----------------------------------------+--------------+--------------|
| Complete ZoneSorterByName [3] | 42140/ 0 | 488/ 0 |
| Complete ZoneSorterByOffsetAndName [3] | 42196/ 0 | 544/ 0 |
+---------------------------------------------------------------------+
- STM32F103C8, 72 MHz ARM Cortex-M3
- Arduino IDE 1.8.19, Arduino CLI 0.33.0
- STM32duino 2.5.0
+----------------------------------------------------------------------+
| Functionality | flash/ ram | delta |
|----------------------------------------+--------------+--------------|
| baseline | 21492/ 3840 | 0/ 0 |
|----------------------------------------+--------------+--------------|
| LocalDateTime | 21848/ 3856 | 356/ 16 |
| ZonedDateTime | 21928/ 3872 | 436/ 32 |
| Manual ZoneManager | 22504/ 3848 | 1012/ 8 |
|----------------------------------------+--------------+--------------|
| Basic TimeZone (1 zone) | 26308/ 4056 | 4816/ 216 |
| Basic TimeZone (2 zones) | 26680/ 4264 | 5188/ 424 |
| BasicZoneManager (1 zone) | 26428/ 4076 | 4936/ 236 |
| BasicZoneManager (all zones) | 42732/ 4076 | 21240/ 236 |
| BasicZoneManager (all zones+links) | 51264/ 4076 | 29772/ 236 |
|----------------------------------------+--------------+--------------|
| Basic ZoneSorterByName [1] | 26896/ 4080 | 468/ 4 |
| Basic ZoneSorterByOffsetAndName [1] | 26972/ 4080 | 544/ 4 |
|----------------------------------------+--------------+--------------|
| Extended TimeZone (1 zone) | 28176/ 4580 | 6684/ 740 |
| Extended TimeZone (2 zones) | 28548/ 5312 | 7056/ 1472 |
| ExtendedZoneManager (1 zone) | 28292/ 4588 | 6800/ 748 |
| ExtendedZoneManager (all zones) | 59532/ 4588 | 38040/ 748 |
| ExtendedZoneManager (all zones+links) | 69104/ 4588 | 47612/ 748 |
|----------------------------------------+--------------+--------------|
| Extended ZoneSorterByName [2] | 28756/ 4592 | 464/ 4 |
| Extended ZoneSorterByOffsetAndName [2] | 28828/ 4592 | 536/ 4 |
|----------------------------------------+--------------+--------------|
| Complete TimeZone (1 zone) | 28712/ 4580 | 7220/ 740 |
| Complete TimeZone (2 zones) | 29948/ 5312 | 8456/ 1472 |
| CompleteZoneManager (1 zone) | 28828/ 4588 | 7336/ 748 |
| CompleteZoneManager (all zones) | 108964/ 4588 | 87472/ 748 |
| CompleteZoneManager (all zones+links) | 118536/ 4588 | 97044/ 748 |
|----------------------------------------+--------------+--------------|
| Complete ZoneSorterByName [3] | 29292/ 4592 | 464/ 4 |
| Complete ZoneSorterByOffsetAndName [3] | 29364/ 4592 | 536/ 4 |
+---------------------------------------------------------------------+
- SAMD51, 120 MHz ARM Cortex-M4
- Arduino IDE 1.8.19, Arduino CLI 0.33.0
- Adafruit SAMD 1.7.11
+----------------------------------------------------------------------+
| Functionality | flash/ ram | delta |
|----------------------------------------+--------------+--------------|
| baseline | 10580/ 0 | 0/ 0 |
|----------------------------------------+--------------+--------------|
| LocalDateTime | 10872/ 0 | 292/ 0 |
| ZonedDateTime | 11544/ 0 | 964/ 0 |
| Manual ZoneManager | 11536/ 0 | 956/ 0 |
|----------------------------------------+--------------+--------------|
| Basic TimeZone (1 zone) | 15388/ 0 | 4808/ 0 |
| Basic TimeZone (2 zones) | 15756/ 0 | 5176/ 0 |
| BasicZoneManager (1 zone) | 15508/ 0 | 4928/ 0 |
| BasicZoneManager (all zones) | 31444/ 0 | 20864/ 0 |
| BasicZoneManager (all zones+links) | 39692/ 0 | 29112/ 0 |
|----------------------------------------+--------------+--------------|
| Basic ZoneSorterByName [1] | 15996/ 0 | 488/ 0 |
| Basic ZoneSorterByOffsetAndName [1] | 16048/ 0 | 540/ 0 |
|----------------------------------------+--------------+--------------|
| Extended TimeZone (1 zone) | 17296/ 0 | 6716/ 0 |
| Extended TimeZone (2 zones) | 17672/ 0 | 7092/ 0 |
| ExtendedZoneManager (1 zone) | 17412/ 0 | 6832/ 0 |
| ExtendedZoneManager (all zones) | 48076/ 0 | 37496/ 0 |
| ExtendedZoneManager (all zones+links) | 57304/ 0 | 46724/ 0 |
|----------------------------------------+--------------+--------------|
| Extended ZoneSorterByName [2] | 17900/ 0 | 488/ 0 |
| Extended ZoneSorterByOffsetAndName [2] | 17952/ 0 | 540/ 0 |
|----------------------------------------+--------------+--------------|
| Complete TimeZone (1 zone) | 17792/ 0 | 7212/ 0 |
| Complete TimeZone (2 zones) | 19028/ 0 | 8448/ 0 |
| CompleteZoneManager (1 zone) | 17908/ 0 | 7328/ 0 |
| CompleteZoneManager (all zones) | 97608/ 0 | 87028/ 0 |
| CompleteZoneManager (all zones+links) | 106840/ 0 | 96260/ 0 |
|----------------------------------------+--------------+--------------|
| Complete ZoneSorterByName [3] | 18396/ 0 | 488/ 0 |
| Complete ZoneSorterByOffsetAndName [3] | 18444/ 0 | 536/ 0 |
+---------------------------------------------------------------------+
- NodeMCU 1.0, 80MHz ESP8266
- Arduino IDE 1.8.19, Arduino CLI 0.33.0
- ESP8266 Boards 3.0.2
+----------------------------------------------------------------------+
| Functionality | flash/ ram | delta |
|----------------------------------------+--------------+--------------|
| baseline | 260089/27892 | 0/ 0 |
|----------------------------------------+--------------+--------------|
| LocalDateTime | 260613/27912 | 524/ 20 |
| ZonedDateTime | 261573/27928 | 1484/ 36 |
| Manual ZoneManager | 261553/27900 | 1464/ 8 |
|----------------------------------------+--------------+--------------|
| Basic TimeZone (1 zone) | 267117/28528 | 7028/ 636 |
| Basic TimeZone (2 zones) | 267533/28736 | 7444/ 844 |
| BasicZoneManager (1 zone) | 267277/28552 | 7188/ 660 |
| BasicZoneManager (all zones) | 283613/28552 | 23524/ 660 |
| BasicZoneManager (all zones+links) | 292141/28552 | 32052/ 660 |
|----------------------------------------+--------------+--------------|
| Basic ZoneSorterByName [1] | 268029/28552 | 752/ 0 |
| Basic ZoneSorterByOffsetAndName [1] | 268157/28552 | 880/ 0 |
|----------------------------------------+--------------+--------------|
| Extended TimeZone (1 zone) | 269653/29152 | 9564/ 1260 |
| Extended TimeZone (2 zones) | 270069/29880 | 9980/ 1988 |
| ExtendedZoneManager (1 zone) | 269813/29160 | 9724/ 1268 |
| ExtendedZoneManager (all zones) | 301077/29160 | 40988/ 1268 |
| ExtendedZoneManager (all zones+links) | 310645/29160 | 50556/ 1268 |
|----------------------------------------+--------------+--------------|
| Extended ZoneSorterByName [2] | 270549/29160 | 736/ 0 |
| Extended ZoneSorterByOffsetAndName [2] | 270613/29160 | 800/ 0 |
|----------------------------------------+--------------+--------------|
| Complete TimeZone (1 zone) | 270145/29508 | 10056/ 1616 |
| Complete TimeZone (2 zones) | 271425/30236 | 11336/ 2344 |
| CompleteZoneManager (1 zone) | 270289/29516 | 10200/ 1624 |
| CompleteZoneManager (all zones) | 350449/29516 | 90360/ 1624 |
| CompleteZoneManager (all zones+links) | 360017/29516 | 99928/ 1624 |
|----------------------------------------+--------------+--------------|
| Complete ZoneSorterByName [3] | 271041/29516 | 752/ 0 |
| Complete ZoneSorterByOffsetAndName [3] | 271089/29516 | 800/ 0 |
+---------------------------------------------------------------------+
- ESP32-01 Dev Board, 240 MHz Tensilica LX6
- Arduino IDE 1.8.19, Arduino CLI 0.33.0
- ESP32 Boards 2.0.9
+----------------------------------------------------------------------+
| Functionality | flash/ ram | delta |
|----------------------------------------+--------------+--------------|
| baseline | 228345/21976 | 0/ 0 |
|----------------------------------------+--------------+--------------|
| LocalDateTime | 230757/21984 | 2412/ 8 |
| ZonedDateTime | 231737/22000 | 3392/ 24 |
| Manual ZoneManager | 231749/21976 | 3404/ 0 |
|----------------------------------------+--------------+--------------|
| Basic TimeZone (1 zone) | 235929/22184 | 7584/ 208 |
| Basic TimeZone (2 zones) | 236365/22392 | 8020/ 416 |
| BasicZoneManager (1 zone) | 236097/22208 | 7752/ 232 |
| BasicZoneManager (all zones) | 252401/22208 | 24056/ 232 |
| BasicZoneManager (all zones+links) | 260929/22208 | 32584/ 232 |
|----------------------------------------+--------------+--------------|
| Basic ZoneSorterByName [1] | 236649/22208 | 552/ 0 |
| Basic ZoneSorterByOffsetAndName [1] | 236729/22208 | 632/ 0 |
|----------------------------------------+--------------+--------------|
| Extended TimeZone (1 zone) | 238173/22712 | 9828/ 736 |
| Extended TimeZone (2 zones) | 238577/23440 | 10232/ 1464 |
| ExtendedZoneManager (1 zone) | 238309/22720 | 9964/ 744 |
| ExtendedZoneManager (all zones) | 269541/22720 | 41196/ 744 |
| ExtendedZoneManager (all zones+links) | 279125/22720 | 50780/ 744 |
|----------------------------------------+--------------+--------------|
| Extended ZoneSorterByName [2] | 238861/22720 | 552/ 0 |
| Extended ZoneSorterByOffsetAndName [2] | 238937/22720 | 628/ 0 |
|----------------------------------------+--------------+--------------|
| Complete TimeZone (1 zone) | 238669/22712 | 10324/ 736 |
| Complete TimeZone (2 zones) | 239941/23440 | 11596/ 1464 |
| CompleteZoneManager (1 zone) | 238805/22720 | 10460/ 744 |
| CompleteZoneManager (all zones) | 318933/22720 | 90588/ 744 |
| CompleteZoneManager (all zones+links) | 328501/22720 | 100156/ 744 |
|----------------------------------------+--------------+--------------|
| Complete ZoneSorterByName [3] | 239357/22720 | 552/ 0 |
| Complete ZoneSorterByOffsetAndName [3] | 239429/22720 | 624/ 0 |
+---------------------------------------------------------------------+