Warum ist .index schneller als .all?

8

Hier sind zwei einfache Blöcke, die dasselbe tun:

%Vor%

Außer, dass der zweite immer ein bisschen schneller ist. Warum?

%Vor%     
Vlad the Impala 03.03.2013, 21:28
quelle

2 Antworten

5

Der Grund ist, dass index eine Methode von Array ist. Ruby wird (in C) über die Elemente iterieren und sie nacheinander an den Block übergeben.

Auf der anderen Seite sind all? , none? , one? (die alle um 30% langsamer sind) Methoden von Enumerable . Sie rufen each auf, was zu einer C-Funktion führt, die zum Block führt. Der Unterschied im Timing ist auf die Tatsache zurückzuführen, dass zwei yield s beteiligt sind.

Beachten Sie, dass spezialisierte Versionen von all? et al. könnte auf Array definiert werden und du würdest die gleiche Leistung bekommen wie index , aber das wäre ein bisschen hässlich und überflüssig ...

    
Marc-André Lafortune 04.03.2013, 00:56
quelle
1

Dies könnte an dem zusätzlichen Schritt ! in jeder Runde der Iteration mit all? liegen.

    
sawa 03.03.2013 21:38
quelle

Tags und Links