Dit is een vergelijking van appels met peren. Zie http://redis.io/topics/benchmarks
Redis is een efficiënte afstandsbediening gegevensopslag. Elke keer dat een opdracht op Redis wordt uitgevoerd, wordt er een bericht naar de Redis-server gestuurd, en als de client synchroon is, wordt het wachten op het antwoord geblokkeerd. Dus naast de kosten van de opdracht zelf, betaalt u voor een netwerkrondreis of een IPC.
Op moderne hardware zijn netwerkrondritten of IPC's verrassend duur in vergelijking met andere operaties. Dit is te wijten aan verschillende factoren:
- de onbewerkte latentie van het medium (voornamelijk voor netwerk)
- de latentie van de planner van het besturingssysteem (niet gegarandeerd op Linux/Unix)
- geheugencachemissers zijn duur en de kans op cachemissers neemt toe terwijl de client- en serverprocessen in/uit worden gepland.
- op high-end dozen, NUMA-bijwerkingen
Laten we nu de resultaten bekijken.
Als we de implementatie met generatoren vergelijken met die met functieaanroepen, genereren ze niet hetzelfde aantal roundtrips naar Redis. Met de generator heb je gewoon:
while time.time() - t - expiry < 0:
yield r.get(fpKey)
Dus 1 retour per iteratie. Met de functie heb je:
if r.exists(fpKey):
return r.get(fpKey)
Dus 2 roundtrips per iteratie. Geen wonder dat de generator sneller is.
Het is natuurlijk de bedoeling dat je dezelfde Redis-verbinding hergebruikt voor optimale prestaties. Het heeft geen zin om een benchmark uit te voeren die systematisch verbinding maakt/verbreekt.
Ten slotte, wat betreft het prestatieverschil tussen Redis-oproepen en het gelezen bestand, vergelijkt u eenvoudig een lokale oproep met een externe oproep. Het uitlezen van bestanden wordt in de cache opgeslagen door het OS-bestandssysteem, dus het zijn snelle geheugenoverdrachtsbewerkingen tussen de kernel en Python. Er is hier geen schijf-I/O bij betrokken. Met Redis moet je de kosten van de retourvluchten betalen, dus het is veel langzamer.