[OpenLayers-Dev] [OpenLayers 3] type instantiation performance

XinGang Li slinavlee at gmail.com
Sat Oct 16 09:22:21 EDT 2010


May be nobody need to create types interit from LonLat, Size, Pixel or
Bounds.

Li XinGang
EMail: slinavlee at gmail.com
Blog:   avlee.cnblogs.com
Site:    www.mapboost.org


On Sat, Oct 16, 2010 at 8:37 PM, Eric Lemoine
<eric.lemoine at camptocamp.com>wrote:

> Hi
>
> When defining the roadmap for OpenLayers 3 we mentioned drag/pan
> performance. Profiling with FireBug shows that a great deal of time is
> spent in the Class function, which is the inner function of
> OpenLayers.Class [*]. This is because (a) we create lots of objects
> (Bounds, LonLat) when panning, and (b) creating objects has a cost:
>
> >>> A = OpenLayers.Class({initialize: function() {}});
> >>> start = new Date; for(var i=0,l=100000; i<l; i++) { var a = new A;}
> stop = new Date; console.log(stop.getTime()-start.getTime());
> 500
>
> If type A is defined using plain JavaScript then creating objects
> isn't as costly:
>
> >>> A = function() {};
> >>> start = new Date; for(var i=0,l=100000; i<l; i++) { var a = new A;}
> stop = new Date; console.log(stop.getTime()-start.getTime());
> >>> 270
>
> So should we consider changing the way we create types in OpenLayers?
> (I'd think so.)
>
> First, for types that do not extend others, I think we should use
> plain JavaScript:
>
> A = function() {}; // constructor
> A.prototype = {}; // prototype definition
>
> For inheritance I'd suggest that we provide a simple function, whose
> usage would be something like this:
>
> // the super class
> P = function() {};
> // the sub-class
> C = function() {
>    P.call(this); // to call parent constructor
> };
> OpenLayers.inherit(C, P);
>
> With OpenLayers.inherit looking like this:
>
> OpenLayers.inherit = function(C, P) {
>    var F = function() {};
>    F.prototype = P.prototype;
>    C.prototype = new F;
>
>    var i, l, o;
>    for(i=2, l=arguments.length; i<l; i++) {
>        o = arguments[i];
>        if(typeof o === "function") {
>            o = o.prototype;
>        }
>        OpenLayers.Util.extend(C.prototype, o);
>    }
>
>    return C;
> };
>
> With something like this we'd incur no performance penalty because of
> the way we create objects. Plus, this is simple, and reduces the size
> of the code a bit.
>
> Thoughts? Comments?
>
>
> [*] <
> http://github.com/openlayers/openlayers/blob/master/lib/OpenLayers/BaseTypes/Class.js#L22
> >
>
> --
> Eric Lemoine
>
> Camptocamp France SAS
> Savoie Technolac, BP 352
> 73377 Le Bourget du Lac, Cedex
>
> Tel : 00 33 4 79 44 44 96
> Mail : eric.lemoine at camptocamp.com
> http://www.camptocamp.com
> _______________________________________________
> Dev mailing list
> Dev at lists.osgeo.org
> http://lists.osgeo.org/mailman/listinfo/openlayers-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.osgeo.org/pipermail/openlayers-dev/attachments/20101016/100b147b/attachment.html


More information about the Dev mailing list