id2key_valueというDictionary<string, Dictionary<string, string>>
にハッシュ(ID)でマッピングされたキーと値のペアがあります。これを、データベースのような表を行で表現する方法と考えることができます。キャスティングの費用は?
public int GetInt(string id, string key)
{
int value = 0;
bool success = int.TryParse(map[id][key], out value);
if (success)
return value;
else
throw new InvalidOperationException(
"Trying to obtain a non-integer value with GetInt().");
}
は、まあ、私は「cast-のアイデアを思い付いたとき、私は賢いされていたと思ったように私は、キャストを実行して、いくつかの基本的なデータ型の使用を容易にするために、いくつかのヘルパー関数を追加しましたキャッシュ "、これは基本的に既に解析されたオブジェクトを保持しているので、int、bool、DateTimeなどの文字列の解析をスキップして、キャッシュから適切なデータ型にキャストするだけです。同様に、
public int GetInt(string id, string key)
{
if (cast_cache.ContainsKey(id) && cast_cache[id].ContainsKey(key))
return (int) cast_cache[id][key];
int value = 0;
bool success = int.TryParse(map[id][key], out value);
if (success)
{
this.AddToCache(id, key, value);
return value;
}
else
throw new InvalidOperationException(
"Trying to obtain a non-integer value with GetInt().");
}
「キャストキャッシュ」は、単にDictionary<string, Dictionary<string, object>>
です。
私はマップに10000の整数を追加してパフォーマンステストを行いました。それから私は "キャストキャッシング"の有無にかかわらず、100万回のランダム検索を行いました。
キャッシングなしで495(ms)、キャッシングで490(ms)かかりました。私はDateTimeを使ってテストを行いました。違いはより重要でしたが、私が期待していたよりも少ない(約750(ms)キャッシュされないキャッシュと約500(ms)キャッシュされた)。
キャストの原則を理解していない、この操作がどれほどコストがかかり、パフォーマンスが文字列から「逆シリアル化」されたものに近いのはなぜですか?
あなたはジェネリックを使用することはできませんどのようになる参照してください? – Dykam
@Dykam、 どうすればよいですか? id2key_valueには、実装されたプロバイダ(ファイル、データベースなど)に永続的に格納できる文字列として逆シリアル化された任意の型を含めることができます。ジェネリック医薬品を使用するビジョンはどこですか? –
構文解析がキャストしていません... –