Am 01.08.2006 um 23:12 schrieb Sebastian Werner:

> Andreas Junghans schrieb:
>> Am 01.08.2006 um 21:23 schrieb Sebastian Werner:
>>
>>> Andreas Junghans schrieb:
>>>> Oh, and I think I missed a crucial point why your IE delete time is
>>>> so high. It's probably not because of the garbage collector, but
>>>> because the array gets reorganized on every delete (since an  
>>>> index is
>>>> actually removed from it as opposed to simply assigning a new  
>>>> value).
>>>> Looks like Firefox is way more efficient here ...
>>> the delete doesn't shorten the array in my opinion.
>>
>> It doesn't change the "length" property of the array, but it does
>> remove the index from the key collection (see "http://
>> developer.mozilla.org/en/docs/
>> Core_JavaScript_1.5_Reference:Operators:Special_Operators:delete_Oper 
>> ato
>> r", last paragraph). After all, a JavaScript array is nothing more
>> than a hash map with an additional "length" property. If you use
>> "delete" on an index, the spec says that "index in myArray" should
>> return false. To be able to do so, there has to be a collection of
>> all the indices somewhere, and this collection is affected by the
>> "delete" operator.
>
> Ah. Cool. Thank you for the information. But this doesn't explain why
> for some stuff arrays are faster. If arrays really are built up with
> hash maps why are they faster for common array actions like loops?

Because you can use simple counter loops ("for (i=0;i<x;i++)") to  
enumerate the keys (instead of "for (x in y)"). I think when you  
iterate over an array with for/in, you get the same performance as  
with any other object. I can't say whether there are some more  
internal optimizations for arrays, but at least semantically they  
behave like ordinary hash maps (with the exception of having an  
automatically updated "length" property whenever numeric keys are used).

Another example:

x = new Array(1);
x[0] = "Test";
alert(x["0"]);

This works just fine (showing an alert with "Test"), exactly like any  
other JS object/hash map where every key is converted to a string.  
And another one:

x = new Array(1);
x[0] = "Test";
for (key in x) {
     alert(key + "/" + typeof key);
}

This displays "0/string", not "0/number". I'm not saying that there's  
really a string for every index (I hope this is optimized away, at  
least in Firefox ;-)), just that an array behaves like a hash map.

> So a delete inside an array is maybe more comparable to a splice?

Not quite. A splice has to re-assign many values to new keys, while  
delete only modifies the key space.

Regards,

   Andreas


-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys -- and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
qooxdoo-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/qooxdoo-devel

Reply via email to