私はElixirとErlangがどのようにハードウェアを使用しているかについていくつかの性能に関する主張を読んできましたが、その根拠を理解しているかどうかを確認しようとしています。いくつかの背景:同じメモリアドレスで `writev`を繰り返し呼び出しても、ハードウェアのキャッシュが可能ですか?
最初に、Erlangは不変な文字列(iolists)のネストされたリストをIO(ファイル、ソケットなど)に書き込むことをサポートし、writev
と文字列のメモリアドレスを使用します(see Evan Miller's blog post on this)。
第二に、the docs for an Erlang web framework called Chicago Bossは言う:
アーランはあなたのRAMを尊重します!
Erlangは、サーバー側のテンプレートをレンダリングするときに、接続されたクライアントごとにメモリ内に別々のWebページのコピーを作成しないため、Erlangは他のプラットフォームとは異なります。代わりに、複数の要求にまたがる同一の不変メモリへのポインタを構築します。
2人で同時に2つの異なるプロファイルページをリクエストすると、ヘッダー、フッター、その他の共有テンプレートスニペットに対して実際に同じチャンクが送信されます。その結果、汗をかくことなく、何百人ものユーザーのために、キャッシュされていない複雑なWebページを構築できるサーバーが実現しました。
第三に、a book about an Elixir (Erlang VM) web framework called Phoenixは言う:
テンプレートをプリコンパイルされています。フェニックスはレンダリングされた各テンプレートの文字列をコピーする必要はありません。 ハードウェアレベルでは、の前にこれらの文字列がキャッシュされていないことがわかります。
ソースを見ると、このフレームワークでは、アイリッシュリストを使用して完成した応答テンプレートを表すことがわかりました。一緒にこのすべてを置く
、私は何を暗示されていますが、ハードウェア、Webフレームワークは、同じメモリ位置から次々Webリクエストを同じヘッダーとフッターの文字列を送信するためにOSを伝えるためにwritev
を使用している場合ということだと思います"ああ、私はその価値を知っている、それはすでにCPUキャッシュに入っているので、RAMを探す必要はありません"と言うことができます。
そうですか?(私はシステムコールとハードウェアをほとんど理解していません)もしそうでなければ、ハードウェアキャッシングがどのように関与しているかについてのアイデアはありますか?
(ボーナスあなたがどのように見るか、何が起こっているかを推測するために私を伝えることができます。)
Evan Millerからのメールの返信:iolistsと共有(refcounted)文字列(> 64バイト)を使用して、この種のキャッシュ使用率を得ることができます。Writevでは、最終的なmemcpy/flatteningをスキップできます。いくつかの負荷。テスト&測定! " –