The way Razor works is that it parses a text stream and generates class. This class is then compiled, loaded and executed. If you don't supply a name, it can't cache the result, so it performs the compilation each time.
On the flipside, using dynamic always incurs a small performance hit of having to load the DLR to handle your dynamic model. We support dynamic, but I'd always recommend a statically typed model over dynamic.