Can you either explain the things you measured, or perhaps just show the tests? I'd be interested to measure the case you are worrying about, say:

  3 instanceof Function

i.e., what is the cost of a failed instanceof, vs. a successful one?

Do you have measurements that indicate the new consolidated arglist processing is actually slower than the old processing of args, constraints, and styles? I would have expected the simplifications in applyArgs et al. would more than make up for any additional overhead.

Also, it might be more profitable to work on the idea of computing a custom applyArgs method for each class at compile time to eliminate all of the remaining interpretation of the arglist.

On 2008-02-20, at 19:23 EST, Max Carlson wrote:

Hi Tucker,

I've been working a few kinks out of the runtime, and reading the docs
on LzNode.construct(), which say:

@param Object args: A dictionary of initialization arguments that should
 * be applied
* to the instance. This contains any arguments that are default arguments
 * written in the class definition.  Note that initial value
 * expressions (`$once{...}`) and constraints (`${...}`), are in this
 * list also, they can be differentiated from initial values by their
 * type: `LzInitExpr` for the former, and `LzConstraintExpr` for the
 * latter.  If you handle the installation of any instance attributes
 * in your construct method, you are responsible for dealing with
 * these "binders" as well.  Normally, they will be processed by
 * LzNode.

So, I did a little performance testing (trunk/test/performance/ typeof-instance-of.lzx) and found a few potential optimizations:

a) typeof func == 'function' is about 2x faster than f instanceof Function.

b) typeof seems to be much faster than instanceof. Since many arguments are not LzInitExpr, it might be worth doing this:
typeof arg == 'object' && arg instanceof LzInitExpr;

instead of just this:
txt instanceof LzInitExpr;

Here are my numbers for swf8:
iterations = 200
empty                         :     6.35us ±    2.23 [5.00..10.00]/100
instanceof : 30.25us ± 2.88 [20.00..35.00]/ 100 typeof : 21.05us ± 2.59 [10.00..25.00]/ 100 typeof with instanceof : 30.00us ± 2.25 [25.00..35.00]/ 100 property lookup : 19.60us ± 2.43 [15.00..25.00]/ 100 typeof with instanceof with short circuit: 15.05us ± 0.87 [10.00..20.00]/100 typeof function : 12.90us ± 2.48 [10.00..15.00]/ 100 instanceof function : 26.40us ± 2.26 [25.00..30.00]/ 100


And for DHTML, firefox OS x:
iterations = 200
empty : 5.65us ± 1.69 [5.00..10.00]/100
instanceof : 29.90us ± 7.85 [15.00..40.00]/100
typeof : 17.40us ± 4.23 [10.00..25.00]/100
typeof with instanceof : 30.40us ± 3.94 [20.00..35.00]/100
property lookup : 15.35us ± 1.78 [10.00..20.00]/100
typeof with instanceof with short circuit: 12.75us ± 2.50 [10.00..15.00]/100
typeof function : 12.40us ± 2.51 [10.00..15.00]/100
instanceof function : 19.10us ± 2.29 [15.00..25.00]/100

Let me know what you think...

--
Regards,
Max Carlson
OpenLaszlo.org



Reply via email to