Warum sind einige Funktionen im Seq-Modul optimiert, während andere nicht in F # waren?

8

Dies ist eine Folge meiner vorherigen Frage in Bezug auf die Funktionen Seq und iter des Moduls map , die im Vergleich zu den Modul-Entsprechungen Array und List viel langsamer sind.

Wenn ich mir die Quelle anschaue, kann ich sehen, dass einige Funktionen wie isEmpty und length eine sehr einfache Typüberprüfung durchführen, um Arrays und Listen zu optimieren, bevor man IEnumerator verwendet.

%Vor%

Im Fall von iter kann der gleiche Ansatz verfolgt werden, um die Performance erheblich zu verbessern, wenn ich <% s% s co_de% function zeigte gegenüber der eingebauten Version deutliche Vorteile:

%Vor%

Meine Frage ist, dass einige der Funktionen im Modul iter für die Verwendung mit bestimmten Sammlungstypen (Arrays, Liste & lt; T & gt; usw.) optimiert wurden, wie andere Funktionen wie Seq und iter wurden nicht in ähnlicher Weise optimiert?

Auch im Fall von nth function, wie @mausch herausfand, ist es nicht möglich, einen ähnlichen Ansatz für map (siehe unten) zu verwenden und spezialisierte Iteratoren für verschiedene Sammlungstypen aufzubauen?

%Vor%

Vielen Dank im Voraus.

    
theburningmonk 04.06.2012, 21:53
quelle

2 Antworten

4
  

Im Fall der iter kann derselbe Ansatz verfolgt werden, um seine Leistung erheblich zu verbessern

Ich denke, hier ist die Antwort auf Ihre Frage. Ihr Test ist künstlich und testet keine realen Beispiele dieser Methoden. Sie haben 10.000.000 Iterationen dieser Methoden getestet, um Timing-Unterschiede in ms zu erhalten.

Umgerechnet auf Artikelkosten, hier sind sie:

%Vor%

Diese Methoden werden normalerweise einmal pro Sammlung verwendet, was bedeutet, dass diese Kosten ein zusätzlicher linearer Faktor für die Leistung Ihres Algorithmus sind. Im schlimmsten Fall verlieren Sie weniger als 100 ns pro Element in einer Liste (die Sie nicht verwenden sollten, wenn Ihnen die Performance so wichtig ist).

Vergleichen Sie dies mit dem Fall von length , der im allgemeinen immer linear ist. Durch das Hinzufügen dieser Optimierung bieten Sie einen enormen Vorteil für jemanden, der vergessen hat, die Länge manuell zu cachen, aber zum Glück erhält er immer eine Liste.

Ähnlich können Sie isEmpty viele Male aufrufen, und das Hinzufügen einer anderen Objekt-Erstellung ist albern, wenn Sie direkt danach fragen können. (Dieser ist nicht so stark ein Argument)

Eine andere Sache, die man beachten sollte ist, dass keine dieser Methoden mehr als ein Element der Ausgabe betrachtet. Was würden Sie von dem folgenden Code erwarten (ohne Syntaxfehler oder fehlende Methoden)

%Vor%     
Guvante 05.06.2012 17:39
quelle
1

Auf der Oberfläche scheinen die Typüberprüfungen in Seq.length / isEmpty wie Fehler zu sein. Ich nehme an, dass die meisten Seq -Funktionen solche Orthogonalitätsprüfungen nicht durchführen: typspezifische Versionen existieren bereits in den List / Array -Modulen. Warum duplizieren sie?

Diese Prüfungen sind in LINQ sinnvoller, da sie nur IEnumerable direkt verwenden.

    
Daniel 04.06.2012 22:11
quelle

Tags und Links