Sind Monoide bei der Optimierung nützlich?


7

Viele übliche Operationen sind Monoide . Haskell hat diese Beobachtung genutzt, um viele Funktionen höherer Ordnung allgemeiner zu gestalten ( Foldableein Beispiel).

Es gibt eine offensichtliche Möglichkeit, mit Monoiden die Leistung zu verbessern: Die Programmierer behaupten die Assoziativität der Operation, sodass Operationen parallelisiert werden können.

Ich bin gespannt, ob es noch andere Möglichkeiten gibt, wie ein Compiler den Code optimieren kann, da er weiß, dass es sich um ein Monoid handelt.


Zufälligerweise hat der Autor der HLearn-Bibliothek jetzt eine Reihe von Beiträgen dazu.
Xodarap

Antworten:


7

Der Compiler kann die Exponentiation mit Monoiden optimieren. Lassen ein binärer Operator sein, der in konstanter Zeit so berechnet werden kann, dass und a1,a2,...Abilden ein Monoid. Dann die Operation

[1..n]ak=akakakn times

was normalerweise dauert O(n) Die Zeit kann nur mit dem Quadrat- und Multiplikationsalgorithmus ausgewertet werden O(logn) Zeit, wenn der Compiler das weiß gehorcht den monoiden Gesetzen.


1
Schöne Beobachtung. Vielleicht sollten Sie angeben, dass Sie das annehmenakak kann in berechnet werden O(1)Zeit.
Zach Langley

0

Wenn Sie sich im Schritt der konstanten Faltung / konstanten Ausbreitung befinden, können Sie die Identität des Monoids immer dann ignorieren, wenn Sie andere nicht konstante Ausdrücke multiplizieren.


Ich habe darüber nachgedacht - weißt du, ob es tatsächlich schneller ist?
Xodarap

Dies kann beispielsweise innerhalb einer Schleife einen Unterschied machen.
Roberto Mizzoni
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.