6

CodeProjectで説明したのと同様の方法でSession変数をラップしたいと思います。

public static class WebSession
{
  private const string CurrentUserKey = "CurrentUser";

  private static HttpSessionState Session
  {
    get { return HttpContext.Current.Session; }
  }

  public static bool Exists
  {
    get { return Session != null; }
  }

  public static User CurrentUser
  {
    get { return Session[CurrentUserKey] as User; }
    set { Session[CurrentUserKey] = value; }
  }
}

ここに私の質問があります:CurrentUser同じページで複数回アクセスする必要がある場合、ラッピングプロパティにアクセスする代わりにローカル変数に割り当てることでパフォーマンスが向上しますか?またはHttpSessionState、オブジェクトがリクエストごとに1回だけ逆シリアル化されるようにして、同じhttpリクエストでの後続の呼び出しにそれ以上のコストがかからないようにしますか?

ありがとう、アーロン

4

4 に答える 4

6

各リクエストには、セッション状態のメモリ内コピーがあります。したがって、セッション変数をローカルにコピーすることで節約できる唯一のコストは、オブジェクトからタイプへのキャストのコストです。インメモリコピーは、リクエストの最後にセッションに追加されます。

セッションがページ上でシリアル化および逆シリアル化されるかどうかは、選択したセッションプロバイダーによって異なります。In-proc Session Stateの場合、シリアル化は発生しません。セッションサーバーの場合、オブジェクトを最初にシリアル化する必要があります。

于 2010-01-27T21:54:24.930 に答える
4

メモリ内のコピーがあります。値をキャッシュしても、パフォーマンスの向上はごくわずかです。辞書のルックアップのみを保存します。これは、ページの読み込みごとに無数の回数を実行しない限り、速すぎて気付かないでしょう。

また、特定のキーについて、各取得は同じインスタンスへの参照を返し、Sessionも参照を保持することに注意することが重要です。つまり、Sessionからオブジェクトを取得して変更した場合、再シリアル化するためにセッターを再度呼び出す必要はありません。

これと同じことについて質問しました 。.Netプロパティセッターが暗黙的に呼び出されることはありますか?

于 2010-01-27T23:08:26.320 に答える
3

最近、セッションを分解する作業を行いました。確認したところ、状態オブジェクト全体がリクエストごとに1回だけ逆シリアル化されています。もちろん、確認するのは簡単です。2回取り出して確認するだけReferenceEqualsです。

もちろん、使用の合間にフィールドに値を配置すると、「ルックアップ」時間を節約できますが、逆シリアル化のコストは1回だけ支払う必要があります。

本当に確認したい場合は、ISerializableシリアル化/逆シリアル化呼び出しを実装してログに記録することで、これを再確認することもできます。

于 2010-01-27T21:55:03.270 に答える
0

読むべきいくつかの良い記事

http://msdn.microsoft.com/en-us/library/aa479041.aspx

http://msdn.microsoft.com/en-us/magazine/cc163730.aspx#S5

于 2010-01-27T21:44:58.783 に答える