2

私は、次のように Session オブジェクトを呼び出すのがいかに無駄であるか疑問に思っていました(例):

string test = string.Empty;
for (int i = 0; i < 1000; i++)
{
   test += Session["test"].ToString() + ",";
}

これらのような代わりに:

string test = string.Empty;
string test_session_value = Session["test"].ToString();
for (int i = 0; i < 1000; i++)
{
   test += test_session_value + ",";
}

(つまりHttpSessionState、できるだけ少ない回数ではなく、オブジェクトを呼び出してセッションを複数回読み取る)

パフォーマンスの低下はありますか (顕著な)? HttpSessionState開発者はオブジェクトの使用にどの程度注意する必要がありますか?

4

2 に答える 2

3

セッションは、ページがロードされると完全にリーダーになり、ページがアンロードされると保存されます。したがって、シリアル化と非シリアル化は、ページごとに1回だけ発生します。

Dictionary<string,object>セッションはデータをオブジェクトに保存/保持します。

だからあなたがこれを作ったとき

string test = string.Empty;
for (int i = 0; i < 1000; i++)
{
   test += Session["test"].ToString() + ",";
}

実際には、セッションは辞書を呼び出します。これは、インデックスを使用しているため、リストでアイテムを見つけるときに非常に高速です。

このコードで注意しなければならないのは、実際にコストのかかる行である文字列を使用して間違いを犯したことです。本当に速くするには、を使用する必要がありますStringBuilderが、それは実際のコードではなく、表示する方法であるとしましょう。

StringBuilder test = new StringBuilder();
for (int i = 0; i < 1000; i++)
{
   test.Append(Session["test"].ToString());
   test.Append(',');
}

パフォーマンスの低下はありますか?

実生活では、ページごとに1000回セッション変数を呼び出すとは思わないので、セッションからの目立った遅延はありません。注目すべきは、ページがロードおよびアンロードされるまで、セッションがすべてのユーザーをロックしていることです。

相対:ASP.Netのセッションを完全に置き換える

于 2012-05-14T17:15:02.210 に答える
1

セッション状態が IIS に保存されている場合、IIS が大きくなります。

セッション状態が Sql サーバーに格納されている場合、異なるアプリケーション ドメイン間でのデータ転送には時間がかかります。

利点: 1. マシン間で同じセッション状態にアクセスできます。
2. app_pool をリロードした後、同じセッション状態が利用可能です。

短所: 1. プロセス モードよりも遅くなります。
2. セッション状態のすべてのオブジェクトはシリアライズ可能でなければなりません。
3. セッション変数はオンザフライで作成でき、いつでも使用でき、開発者がそれらを明示的に破棄する必要がないため、セッション変数を過度に使用すると、非常に読みにくく保守しにくいコードになる可能性があります。

于 2012-05-14T16:58:05.117 に答える