InhaltsverzeichnisKlicke auf den Link, um zur gewünschten Stelle zu navigieren
Dieser Inhalt wurde automatisch aus dem Ukrainischen übersetzt.
Memoization (Memoisierung) ist eine Optimierungstechnik, die das Caching von Ergebnissen der Funktionsausführung umfasst, um wiederholte Berechnungen bei nachfolgenden Aufrufen zu vermeiden. Dies ist besonders nützlich für teure Operationen (z. B. Datenbankabfragen, komplexe Berechnungen oder API-Interaktionen).
Warum dieser Name?
Der Begriff "memoization" stammt vom englischen Wort "memo" (Notiz, Gedächtnisstütze) und dem lateinischen Wortstamm "memor-" (erinnern). Dies deutet darauf hin, dass die Funktion ihre Ergebnisse "merkt" (cached), um wiederholte Berechnungen zu vermeiden.
Erstmals verwendete dieser Begriff Donald Michie, ein britischer Wissenschaftler im Bereich der künstlichen Intelligenz, bereits 1968. Er beschrieb eine Technik, bei der berechnete Werte für die spätere Verwendung gespeichert werden.
Warum nicht einfach "Caching"?
Memoization ist eine spezifische Art des Cachings.
- Memoization cached normalerweise Funktionsergebnisse auf der Ebene eines Instanz Objekts oder innerhalb eines Prozesses.
- Caching kann im Allgemeinen Datenbank-, Datei-, Redis-Speicherung umfassen und nicht nur in Variablen.
Das bedeutet, dass alle Memoisierung Caching ist, aber nicht alles Caching ist Memoisierung.
Wie funktioniert Memoization in Ruby?
In Ruby wird für die Memoisierung normalerweise der Operator ||= (oder die explizite Speicherung des Wertes in einer Variablen) verwendet, um das Ergebnis in einer Variablen zu speichern und es bei nachfolgenden Aufrufen zurückzugeben.
class User
attr_reader :name
def initialize(name)
@name = name
end
def formatted_name
@formatted_name ||= name.upcase
end
end
user = User.new("Marty")
puts user.formatted_name # Führt die Berechnung aus und speichert den Wert
puts user.formatted_name # Verwendet den gecachten Wert
In diesem Fall bedeutet @formatted_name ||= name.upcase:
- Wenn @formatted_name noch nicht gesetzt ist (nil oder false), erhält es den Wert name.upcase.
- Andernfalls wird der bereits gespeicherte Wert zurückgegeben.
Hinweis zu ||=
Der Operator ||= funktioniert korrekt, wenn der Wert nil oder false sein kann, aber wenn der erwartete Wert false sein kann, funktioniert diese Memoisierung nicht. Zum Beispiel:
@result ||= false
Wenn @result false ist, wird der Ausdruck erneut berechnet.
Für zuverlässige Memoisierung kann eine explizite Zuweisung verwendet werden:
@result = some_expensive_operation if @result.nil?
Wie funktioniert Memoization in Rails?
In Ruby on Rails wird Memoisierung verwendet, um Datenbankabfragen und andere aufwendige Operationen zu optimieren. Beispiel für Memoisierung im Modell:
class User < ApplicationRecord
def expensive_query
@expensive_query ||= some_heavy_calculation
end
private
def some_heavy_calculation
sleep(2) # Simulation einer schweren Operation
"Ergebnis der Berechnung"
end
end
user = User.first
puts user.expensive_query # Warten Sie 2 Sekunden
puts user.expensive_query # Erhalten Sie den gecachten Wert
Memoization in before_action im Controller:
class UsersController < ApplicationController
before_action :set_user
def show
render json: { user: @user }
end
private
def set_user
@user ||= User.find(params[:id])
end
end
Dies hilft, wiederholte Datenbankabfragen zu vermeiden, wenn die Methode @user mehrmals in einer Aktion verwendet wird.
Was unterscheidet Memoization von Caching?
Kurz gesagt:
Memoization ist das Speichern des Ergebnisses innerhalb eines laufenden Prozesses (z. B. in einer Instanzvariablen).
Caching ist ein breiterer Begriff, der das Speichern von Daten zwischen Prozessen, in Datenbanken, Dateien, Redis, Memcached usw. umfassen kann.
Dieser Beitrag hat noch keine Ergänzungen vom Autor.