mirror of
https://github.com/esphome/esphome.git
synced 2026-09-14 00:28:39 +00:00
406546876a1be7391a4c9aed6f449b0343545c59
Arduino ESP8266's millis() uses 4x 64-bit multiplies with magic constants to convert system_get_time() to ms while tracking overflow. On the LX106 (no hardware multiply-high instruction), each 64-bit multiply goes through the __umulsidi3 software helper — costing ~3.3 us per call. Replace with a simple accumulator that tracks a running millis counter from system_get_time() deltas using pure 32-bit integer ops (subtract, add, compare, subtract). No 64-bit math, no __umulsidi3. Use -Wl,--wrap=millis to intercept all ::millis() calls site-wide so Arduino libraries and ISR handlers (Wiegand, ZyAura) also get the fast version. Brief interrupt disable (~125 ns) protects the static state. Overflow safety: unsigned 32-bit delta arithmetic handles the 71-minute system_get_time() wrap correctly for one wrap. ESPHome calls millis() thousands of times per second, so missing a full wrap is not a realistic concern. At boot, both the accumulator and system_get_time() start at 0, so no special initialization is needed. Benchmarked on real ESP8266 hardware: Before: 3348 ns/call (Arduino 4x 64-bit multiply) After: ~800-900 ns/call (accumulator, estimated)
Description
ESPHome is a system to control your ESP8266/ESP32 by simple yet powerful configuration files and control them remotely through Home Automation systems.
Readme
Multiple Licenses
594 MiB
Languages
C++
55.8%
Python
43.6%
C
0.3%
JavaScript
0.2%
