Alle Originalinhalte werden auf Ukrainisch erstellt. Noch nicht alle Inhalte wurden übersetzt. Einige Beiträge sind möglicherweise nur auf Ukrainisch verfügbar.Mehr erfahren

Was ist Memoization (Beispiele für Ruby und Ruby on Rails)?

Beitrags-Cover: Was ist Memoization (Beispiele für Ruby und Ruby on Rails)?
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.

Was man wissen muss, um eine erfolgreiche Karriere als Freelancer im IT-Bereich aufzubauen
23. Dez, 16:03 Uhr

Was man wissen muss, um eine erfolgreiche Karriere als Freelancer im IT-Bereich aufzubauen

meme code
meme code@memecode
Virtueller Cloud-Server: Was ist das und was sind seine Besonderheiten
03. Jan, 10:58 Uhr

Virtueller Cloud-Server: Was ist das und was sind seine Besonderheiten

meme code
meme code@memecode
[Fix] Heroku / SearchBox-Addon - Indexierungsfehler "Der Client kann den Server nicht als Elasticsearch verifizieren"
31. Jan, 13:09 Uhr

[Fix] Heroku / SearchBox-Addon - Indexierungsfehler "Der Client kann den Server nicht als Elasticsearch verifizieren"

meme code
meme code@memecode
06. Feb, 15:31 Uhr

Fehlerbehebung [DEPRECATION] #adapters ist veraltet. Verwenden Sie stattdessen #profiles. (Codecov / docile)

meme code
meme code@memecode
Was ist ein Promise in JavaScript und wie versteht man das Wesentliche schnell?
18. Feb, 11:01 Uhr

Was ist ein Promise in JavaScript und wie versteht man das Wesentliche schnell?

meme code
meme code@memecode
Die Struktur von Promise (JavaScript) und wie man damit arbeitet
18. Feb, 14:33 Uhr

Die Struktur von Promise (JavaScript) und wie man damit arbeitet

meme code
meme code@memecode
Was ist Debounce in JavaScript und warum ist es wichtig?
21. Mär, 16:39 Uhr

Was ist Debounce in JavaScript und warum ist es wichtig?

meme code
meme code@memecode
Was ist CFB (Cipher Feedback)?
21. Mär, 16:53 Uhr

Was ist CFB (Cipher Feedback)?

meme code
meme code@memecode
Was ist XOR und wie funktioniert es?
21. Mär, 17:05 Uhr

Was ist XOR und wie funktioniert es?

meme code
meme code@memecode
Embedded-Programmierung: Was ist das und wo fängt man an
24. Mär, 16:48 Uhr

Embedded-Programmierung: Was ist das und wo fängt man an

meme code
meme code@memecode
Pessimistische Sperre in Rails: was ist das und wann sollte man sie anwenden? Welche Alternativen gibt es?
31. Mär, 17:45 Uhr

Pessimistische Sperre in Rails: was ist das und wann sollte man sie anwenden? Welche Alternativen gibt es?

meme code
meme code@memecode
Warum überspringt PostgreSQL die ID beim Speichern neuer Einträge? (Heroku)
31. Mär, 19:13 Uhr

Warum überspringt PostgreSQL die ID beim Speichern neuer Einträge? (Heroku)

meme code
meme code@memecode