Cross Boundary COM/COM+Calls
Frequently used object data should be saved within script variables. This will cut down on COM method calls, which are relatively expensive, compared to accessing script variables. COM calls should be minimized from ASP pages to achieve optimal performance. It is better to write a few lines of ASP code than to wrap it within a COM component.
In practice, accessing COM properties or methods can be deceptively expensive. Here is an example, showing some fairly common code (syntactically speaking):
Foo.bar.blah.baz = Foo.bar.blah.qaz(1)
If Foo.bar.blah.zaq = Foo.bar.blah.abc Then ' ...
When this code runs, here's what happens:
- The variable "Foo" is resolved as a global object.
- The variable "bar" is resolved as a member of "Foo." This turns out to be a COM method call.
- The variable "blah" is resolved as a member of "Foo.bar". This, too, turns out to be a COM method call.
- The variable "qaz" is resolved as a member of foo.bar.blah. Yes, this turns out to be a COM method call.
- Invoke "Foo.bar.blah.quaz(1)". One more COM method call. Get the picture?
- Do steps 1 through 3 again to resolve "baz". The system does not know if the call to "qaz" changed the object model, so steps 1 through 3 must be done again to resolve "baz".
- Resolve "baz" as a member of "Foo.bar.blah". Do the property put.
- Do steps 1 through 3 again and resolve "zaq".
- Do steps 1 through 3 yet another time and resolve "abc".
As you can see, this is terribly inefficient and slow. The fast way to write this code in VBScript is
Set myobj = Foo.bar.blah ' do the resolution of blah ONCE
Myobj.baz = myobj.qaz(1)
If Myobj.zaq = Myobj.abc Then '...
If you're using VBScript 5.0 or later, you can write this using the With statement:
.baz = .qaz(1)
If .zaq = .abc Then '...
Note that this tip also works with VB programming.