Okay Jack you were right. I thought 2ms was too low. In my test I was reading the same attribute over and over and the compiler must have some how optimized for this.
So I did a new test, where I had 1M tags, like your example, then read them all using a normal VI that is inlined, a normal VI that is non-reentrant, and my XNode. For added interest I also had the This VI returned from the Xnode because I figured I would be able to read the execution inofrmation from the XNode VI.
With my test the Normal Inlined VI took 607ms. Probably lower than yours because I am just reading, not checking for validity like your was. My non reentrant was 701ms. The XNode option was 606ms. But interestingly enough when I read the VI Name of my XNode VI reference returned it was the name of the calling VI. So an XNode appears to do some sort of inlining, but I can have things like property nodes in my XNode which normally inlined VIs cannot. Of course doing this screws with all the performance numbers I mentioned earlier so I removed that.
Attached for those interested is my read XNode, along with the VI to check performance. This has a dependency on the LAVA Scripting Tools. But I think that's it.
I made this Read XNode because I wanted it to have the combined ability that a polymorphic VI can have, where you right click and choose the type, or you could wire in the type. So right click the XNode and you can choose from a large list of data types to read, or if you pick Automatic you can wire in the type to use. I'd like to release this at some point but for now it is a learning exercise.
EDIT: Saved in 2012
XNode Performance Test.zip