For the first question:
Simply put: invokedynamic has been very carefully designed (so it took so long to get it in Java); and one of the side effects of this: extremely effective performance.
See here for further reading. Quote from there:
invokedynamic also benefits dynamic language developers by supporting dynamically changing site targets β the call site, or rather, the dynamic call site β is invokedynamic. Furthermore, since the JVM internally supports invokedynamic, this command can be better optimized by the JIT compiler.
So, a long story: at least theoretically, when you can write code that uses invokedynamic instead of some "old school", a way to solve the same problem, a new invokedynamic solution has certain chances to be "faster". Like in: faster to use invokedynamic compared to the old way of creating an anonymous inner class and use it.
source share