Du meinst, die wiederholte Qualifizierung macht den Code echt langsamer? Das muß ich mir merken ...
Es wird ja jedesmal der Getter der entsprechenden Eigenschaft aufgerufen. Je nachdem was dieser macht, kann das deutlich langsamer sein.
Und selbst wenn nur die entsprechende Position des Feldes in dem Objekt aufgelöst werden muss, weil es keinen Getter gibt, braucht das mindestens einen Assemblerbefehl pro Stufe mehr.
Dazu kommt, dass der Compiler beim einmaligen Abruf die Register besser optimieren kann, da er ermitteln kann von wo bis wo dieser konkrete Wert benötigt wird und diesen dann z.B. in einem Register halten kann.
Heißt: Langsamer ist es in jedem Fall, wie viel hängt vom konkreten Fall ab.
Im konkreten Fall werden bei jedem Aufruf nur 3 Assemblerbefehle eingespart, weil es keine Getter gibt. Den Unterschied siehst du hier:
Links siehst du wie die Kette von Label1 über Canvas und Font aufgelöst wird. Rechts wird der Wert im Stack an Adresse ebp-$08 gespeichert und dann jeweils nur daraus hervorgeholt um dann direkt für den Aufruf in eax gespeichert zu werden. (Das Objekt, auf das sich eine Methode bezieht, wird immer als erster Parameter in eax mitgegeben.)
Bei with kommt übrigens der gleiche Code heraus wie mit der Zwischenvariable, denn wie schon geschrieben macht with ja nichts anderes, nur eben schlechter.