0

Session[Constant] と Session["String Literal"] のパフォーマンス

ViewData["CartItems"] = Session["CartItems"];すべてのリクエストでキーの文字列リテラルのようなユーザー固有のデータを取得しています。これには定数を使用する必要がありますか?

はいの場合、頻繁に使用される文字列リテラルを実装するにはどうすればよいですか?トラフィックの多いサイトでのパフォーマンスに大きな影響を与えますか?


関連する質問は、ASP.NET MVC またはSession.

4

5 に答える 5

3

定数を使用すると、入力を間違えるとコンパイラがエラーを返しますが、文字列の入力を間違えると奇妙なバグが発生するだけです。

パフォーマンスの違いは非常に小さいため、測定が非常に困難です。

于 2010-04-06T19:44:14.700 に答える
3

定数を使用する理由は、パフォーマンスではなく保守性に関係しています。性能はどちらもほぼ同じです。

文字列リテラルでは、それが別の文字列リテラルと意図的に同じであるか偶然であるかを決して区別できないため、いずれかを変更するときに、他のどの文字列リテラルを変更すればよいかわかりません。しかし、定数に値がある場合は、変更を 1 か所で行うだけです。

悪い:

ViewData["username"] = Session["username"];

良い:

const UserNameSessionKey = "username";
const UserNameViewDataKey = "username";

ViewData[UserNameViewDataKey] = Session[UserNameSessionkey];

ビューデータ キーの値を変更せずに、セッション キーの値を「userName」に変更することを想像してみてください...

于 2010-04-06T19:58:02.650 に答える
1

保守性をさらに高めましょう。セッションの使用に関する他の回答を引用します。

ショッピング カートを ASP.NET MVC アプリケーションのセッションに保存するとします。に格納されますがSession["ShoppingCart"]、簡単で厳密に型指定されたアクセスと高いテスト容易性が必要です。

まず、インターフェースを定義します。

public interface ISessionWrapper
{
    List<CartItem> ShoppingCart { get; set; }
}

次に、HttpContext の実装を作成します。

public class HttpContextSessionWrapper : ISessionWrapper
{
    private T GetFromSession<T>(string key)
    {
        return (T) HttpContext.Current.Session[key];
    }

    private void SetInSession(string key, object value)
    {
        HttpContext.Current.Session[key] = value;
    }

    public List<CartItem> ShoppingCart
    {
        get { return GetFromSession<List<CartItem>>("ShoppingCart"); }
        set { SetInSession("ShoppingCart", value); }
    }
}

GetFromSession と SetInSession は、Session でのデータの取得と設定を容易にするヘルパー メソッドです。これらは、Session の他のフィールドにアクセスするために簡単に再利用できます。

次に、ベース コントローラーを定義します (ASP.NET MVC に適用可能)。

public class BaseController : Controller
{
    public ISessionWrapper SessionWrapper { get; set; }

    public BaseController()
    {
        SessionWrapper = new HttpContextSessionWrapper();
    }
}

コントローラーの外部でセッションを使用する場合は、新しい HttpContextSessionWrapper() を作成または挿入するだけです。

Controller テストで SessionWrapper を ISessionWrapper モックに置き換えることができるため、HttpContext に依存しなくなります。を呼び出す代わりに を呼び出すため、Session もより使いやすくなり(List<CartItem>)Session["ShoppingCart"]ますSessionWrapper.ShoppingCart。見た目が良くなりましたね。

ビューにモデル クラスを使用せず、モデル クラスを使用する方がよいと思われる場合は、ViewData でも同じことができます。

public interface IViewDataWrapper
{
    List<CartItem> ShoppingCart { get; set; }
}

public class ViewDataWrapper : IViewDataWrapper
{
}

public class BaseController : Controller
{
    public IViewDataWrapper ViewDataWrapper { get; set; }

    public BaseController()
    {
        IViewDataWrapper = new ViewDataWrapper();
    }
}

そして、単純にコントローラーで:

ViewDataWrapper.ShoppingCart = SessionWrapper.ShoppingCart 

または、ViewData と特定のモデルを使用しないことにした場合:

Model.ShoppingCart = SessionWrapper.ShoppingCart

そして単にビューで(ビューの基本クラスを定義し、このインターフェースを導入した場合):

<%= ViewDataWrapper.ShoppingCart %>

また

<%= Model.ShoppingCart %>

文字列のタイプミスがなく、厳密にタイプされ、見栄えが良い。

于 2010-04-06T23:00:49.023 に答える
0

簡単なメモですが、より良い例の多くには、文字列定数を含む SessionKeys のクラスがあります。これは、必要に応じて単体テストで定数を呼び出すことができるため、単体テストにも役立ちます。

例(キーは1つだけですが、明らかにさらに追加できます

public class SessionKeys
{
    public const string UserDto = "UserDto";
}

そのように使用されます(私はSessionStateWrapperを使用します)

UserDto userDto = _sessionStateWrapper.GetItem(SessionKeys.UserDto) as UserDto;
于 2010-04-06T23:25:02.247 に答える
0

ディクショナリ キーの長さに関するこのベンチマークによると、キーが短いほど高速です。ここで引用:

C# での辞書文字列キーの長さのベンチマーク

ルックアップ キーを短くすると、大幅に高速になりますか? キーが短くなるにつれて、ルックアップ時間は速くなります。

  • キー A - 20 文字: 4436 ms [最も遅い]
  • キー B - 10 文字: 2010 ミリ秒
  • キー C - 5 文字: 1749 ミリ秒
  • キー D - 2 文字: 1575 ms [最速]

どこ:

  • キー A = "01234567890123456789";
  • キー B = "0123456789";
  • キー C = "01234";
  • キー D = "01";
于 2010-04-06T23:27:33.457 に答える