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 개의 정수가 추가 된 성능 테스트를 수행했습니다. 그런 다음 "캐스팅 캐싱"의 유무에 관계없이 무작위로 1 백만 건의 검색을 수행했습니다.
캐싱없이 495 (ms) 및 캐싱을 사용하여 490 (ms) 걸렸습니다. 나는 또한 DateTime을 사용하여 테스트를 실시했다. 차이점은 더 크지 만 예상하지 못한 것 (~ 750 (ms) 비 캐시 된 캐시 ~ 500 (ms) 캐시).
캐스트의 원리를 이해하지 못했지만이 작업이 얼마나 비싸고 성능이 문자열에서 "비 직렬화 된"것과 너무 가깝습니까?
당신이 제네릭을 사용할 수 없습니다 어떻게되는지? – Dykam
@Dyamam, 어떻게? id2key_value는 구현 된 공급자 (파일, 데이터베이스 등)에 지속적으로 저장할 수있는 문자열로 역 직렬화되는 모든 유형을 포함 할 수 있습니다. 제네릭을 사용하는 비전은 어디에 있습니까? –
파싱이 캐스팅하지 않습니다 ... –