Wiki link: https://en.wikipedia.org/wiki/Memoization
I have a lot of "stuff" that gets created dynamically from config files at runtime. The "stuff generation" process is pretty quick, but often I need to create a LOT of these objects, and most are identical. The "stuff creation" process is quick and painless when I design my app to work with, say, 1000 "data objects", but then a user comes along and says they need a million of 'em, and now that fraction of a second takes forever.
One easy way to handle this is to bundle up all of my config data and use it as a key for a map, then look up that key prior to running the "generate" function. If it already exists, return the cached value, otherwise, run the code and add it to the cache.
For example, here's what a wrapper looks like around "slow.vi":
This is simple enough on the block diagram, but I have to do it for each function. It would be nice if LabVIEW could do this for me.
I propose that this gets implemented as a VI setting as an option for Run VI or possibly as a checkbox in the Execution menu. Alternatively, you could make it like a VI Refnum where you drop an existing VI into a "box" that handles this wrapping.

There would need to be a bit more to it than a simple checkbox- for example, you'd likely want a way to programmatically force a re-compute for a given input, or clear the cache entirely. And you'd need to decide how you handle shared or preallocated clones, (probably) prevent inlining, that sort of thing.
I would think implementing this at a "core" level would offer speed benefits over making a bunch of wrappers. I think you could probably make an Xnode that does this, but that's far beyond my comfort level, and I'm gunshy on them anyway, especially since I'll be using this mostly with objects.