これはリンゴとオレンジの比較です。http://redis.io/topics/benchmarks
を参照してください。Redisは効率的なリモートです データストア。コマンドがRedisで実行されるたびに、メッセージがRedisサーバーに送信され、クライアントが同期している場合は、応答の待機がブロックされます。したがって、コマンド自体のコストを超えて、ネットワークラウンドトリップまたはIPCの料金を支払うことになります。
最新のハードウェアでは、ネットワークラウンドトリップまたはIPCは、他の操作と比較して驚くほど高価です。これはいくつかの要因によるものです:
- メディアの生の遅延(主にネットワーク用)
- オペレーティングシステムスケジューラのレイテンシ(Linux / Unixでは保証されません)
- メモリキャッシュミスはコストがかかり、クライアントプロセスとサーバープロセスのイン/アウトがスケジュールされている間、キャッシュミスの可能性が高くなります。
- ハイエンドボックスでは、NUMAの副作用
それでは、結果を確認しましょう。
ジェネレーターを使用した実装と関数呼び出しを使用した実装を比較すると、Redisへのラウンドトリップ数は同じではありません。ジェネレータを使用すると、次のようになります。
while time.time() - t - expiry < 0:
yield r.get(fpKey)
したがって、反復ごとに1ラウンドトリップします。この関数を使用すると、次のことができます。
if r.exists(fpKey):
return r.get(fpKey)
したがって、反復ごとに2ラウンドトリップします。ジェネレーターの方が速いのも不思議ではありません。
もちろん、最適なパフォーマンスを得るために、同じRedis接続を再利用することになっています。体系的に接続/切断するベンチマークを実行する意味はありません。
最後に、Redis呼び出しとファイル読み取りのパフォーマンスの違いについては、ローカル呼び出しとリモート呼び出しを比較しているだけです。ファイル読み取りはOSファイルシステムによってキャッシュされるため、カーネルとPython間の高速メモリ転送操作です。ここにはディスクI/Oは含まれていません。 Redisを使用すると、往復の費用を支払う必要があるため、はるかに遅くなります。