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.
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:
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?
Vielen Dank im Voraus.
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% 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.
Tags und Links f# performance collections