As mentioned by @inner walrus in the issues #838,
Caching is probably doable in the context of a single transaction, but crossing transaction boundary is probably fairly challenging:
as cpuInstructionCount is a non refundable resource, we'd have to come up with some scheme that allows to reason at the tx set level (to also divide up fairly the cost of instantiation between transactions).
If we were to do it at the transaction level only, I am not sure the benefits would be there.
Could you please clarify, are there any plans to cache loaded contracts at least on the transaction level? It makes sense from the perspective of contract developers. Without caching, developers will likely have to rely on caching responses on the contract level to avoid high fees.
Also, this behavior falls in line with widely-adopted in most programming languages dynamic modules concept -- dynamic modules are loaded once on-demand and then can be reused without loading penalties throughout the whole lifecycle of the application.
If caching on the tx level is not an option, we'll need to extend SEP-40 draft (price feed oracles) with additional functions to allow batched price retrieval for several assets. Otherwise, current approach makes some usage scenarios quite expensive. E.g. when a client contract has to make several subsequent calls to an oracle contract to fetch data for several assets. That's the problem we and @deft dagger are facing right now.