On every request, ACF_Local_JSON has four callbacks registered on the acf/include_* actions:
* include_fields
* include_post_types
* include_taxonomies
* ACF_UI_Options_Page::include_json_options_pages
Each callback calls scan_files( $post_type ). scan_files() walks every load path, then file_get_contents() and json_decode() every .json file, just to read its key and decide whether the file belongs to the type being scanned. After that, each matching file is decoded a second time when it gets registered.
So every JSON file is read and decoded four times per request, plus once more for the type it belongs to. This happens even when a type has no JSON at all: we have no post types, taxonomies or options pages in JSON, and those three scans still decode all 145 field-group files.
Measured impact (production site, 13 load paths, 145 JSON files, about 1.2 MB):
Callback Time
include_fields ~34 ms
include_post_types ~17 ms
include_taxonomies ~17 ms
include_json_options_pages ~17 ms
Total ~85 ms
That's about 85 ms on every request that misses the page cache: logged-in pages, cart, checkout, admin-ajax, and REST.
Suggested fixes
  1. Scan once per request. Decode each file a single time, group the results by type (the key prefix), and let the four include_* callbacks read from that one result.
  2. Cache the scan across requests, with a cache key built from each file's path, mtime, and size, so an edit or a sync invalidates it straight away.