'c#'에 해당되는 글 2건

  1. 2018.04.11 var
  2. 2018.03.25 C# Dictionary의 성능에 대해서.
프로그래밍/C#2018. 4. 11. 11:09

var

c#에는 var이라는 키워드가 있다.

(개념 https://msdn.microsoft.com/ko-kr/library/bb384061(v=vs.120).aspx)

명식적으로 타입을 선언 하는 것이 아닌

암시적으로 타입을 선언하는 것이다.

 

int k =30; (명시적으로 int라고 선언)

var k =30; (암시적으로 선언)

밑에 var을 사용한 경우에는 컴파일러가 오른쪽에 있는 식에서 변수 형식을 유추한다.

이렇게 var을 사용 하더라도 성능에는 전혀 영향이 없다고 한다.

(C#컴파일러는 컴파일 타임에 var변수의 실제 유형을 추론하고, 생성된 IL에는 차이가 없다고 함)

 

그렇다면 var은 어떤 경우에 쓰면 좋을까? msdn에는 이렇게 적혀 있다.

 

1.var 은 쿼리 변수의 생성된 형식을 정확하게 확인하기 어려운 쿼리 식에서 유용할 수도 있습니다. 그룹화 및 정렬 작업에서 이러한 경우가 발생할 수 있습니다

(Ex) IEnumerable<string> , IQueryable<string> 둘을 처리할 때의 성능이 다르다)

2.var 키워드는 특정 변수 형식이 키보드에서 형식화하기 번거롭거나 명백하거나 코드 가독성에 도움이 되지 않는 경우에도 유용할 수 있습니다. var이 이런 방식으로 유용한 한 가지 예제로 그룹 작업에 사용되는 형식과 같은 중첩 제네릭 형식이 있습니다. 다음 쿼리에서 쿼리 변수의 형식은IEnumerable<IGrouping<string, Student>>입니다. 사용자 및 코드를 유지 관리해야 하는 다른 사용자를 이를 이해하기만 하면 간편하게 암시적 형식화를 사용하는 데 아무 문제도 없습니다.



귀찮게 타입명을 직접 선언하지 않아도 된다는 편의성도 분명 있지만


남발하면 다른 사람이 코드를 이해하기에 별로 좋지 않을 것이라는 생각이 든다.


예를 들어 var data = MyClass.GetData() 이런 식으로 작성을 해 놓으면 만든 사람은 data변수가 정확이 어떤 타입


인지 알 수 있겠으나, 다른 개발자는 data라는 변수가 정확히 어떤 타입인지 한눈에 알지는 못할 것이고 확인을 해


야 할 것이다.


그래서 msdn 문서 맨 밑에도 필요한 경우에만 var을 사용하라고 나와있다.


var을 사용 했을때 모호함을 일으키는 경우라면 명시적으로 선언하는 것이 훨씬 낫다.


특히 내장 숫자 타입을 사용하는 경우 형변환 문제가 생길 수 있기 때문에 피하는 것이 좋다.

 

 

-참고 msdn,effective c#

 

 


'프로그래밍 > C#' 카테고리의 다른 글

코드 교정?  (0) 2018.08.29
스트림이란??  (0) 2018.07.31
캘린더  (0) 2018.03.28
C# Dictionary의 성능에 대해서.  (0) 2018.03.25
C# 자료구조 정리  (0) 2018.03.24
Posted by JinFluenza
프로그래밍/C#2018. 3. 25. 21:16

원문 https://stackoverflow.com/questions/3460729/is-there-a-limit-to-entries-in-a-dictionary



질문 : 3000개정도의 다른 데이터들이 있다. 그것을 구조체에 저장해서 관리하려고 한다.

 

그리고 나의 어플리케이션이 시작할 때 그 데이터들을 전부 Dictionary에 저장 해놓고 게임이 시작하기 전에 불러오려고 한다.

 

이것들의 성능이 궁금하다. 이정도의 데이터가 게임을 느리게 할 것인지

 

그리고 TryGetValue ContainsKey가 느린지?

 

 

 

답변 : 해쉬들이 잘 분포되어 있을때 그정도의 크기에서 TryGetValue와 ContainsKey는 꽤나 빠르다. 

 

Dictionary는 인덱스를 달 수 있는 버킷들(데이터를 담을 빈 공간)을 갖고있다

 

키를 이용해 값을 추가하거나 찾을 때 그것은 GetHashCode()를 이용해서 값을 반환한다

 

GetHashCode()에서는 버킷들의 수보다 적은 값이 나오도록 해쉬를 하고, 그것으로 관련된 버킷을 찾는다

 

버킷은 아마 비어 있거나 안에 여러 개의 아이템들이 있을것이다. Dictionary는 아이템들을 Equals()를 통해 비교한다.

 

찾고자 하는 버킷을 찾는 것은 O(1) 시간이 걸린다

 

그 다음에 같은 버킷 안에 들어있는 값들에 대해서 비교하는 것은 O(n)이 걸린다

 

여기서 O(n) Dictionary 모든 요소에 대한 것이 아니고 버킷 안에서 만이다.

 

일반적으로는 같은 버킷 안에 적은 수의 아이템들이 있을 것이다,

 

만약에 해쉬가 나쁘게 됐으면(중복이 많게) 같은 버킷 안에 많은 키값들이 있을 것이고 시간복잡도는 O(n)에 가까워질 것이다

 

최악의 경우는 List보다 나쁠 것이다, 왜냐하면 List역시 O(n)이지만 딕셔너리는 좀 더 큰 오버헤드를 갖고 있기 때문에.


이것이 의미하는게 걱정 할 만한일인가? 아니다, 심지어 상대적으로 원초적인 해시방법을 쓰더라도 좋은 결과를 얻을 것 이다.

 

만약에 키를 string으로 쓰고 있다면 충분하고도 남는다. 만약에 간단한 빌트인타입을 사용하고 있다면 그건 더 좋을 것이다.

 

 

만약에 딕셔너리 안에서 데이터를 찾는데 오래 걸린 다는 것을 발견 한다면, GetHashCode()하는 방법을 고치거나 IEqualityComparere(외부에서 GetHashCode(),Equals()를 정의)를 만들면 된다.

 

 

하여튼 3000개는 아무것도 아니고, 괜찮을 것이다.


'프로그래밍 > C#' 카테고리의 다른 글

var  (0) 2018.04.11
캘린더  (0) 2018.03.28
C# 자료구조 정리  (0) 2018.03.24
Stack 구현  (0) 2018.03.21
try catch 성능  (0) 2018.03.21
Posted by JinFluenza