2017-11-03 1 views
-2

다음 중 더 많은 쓰레기를 할당하는 호출은 무엇입니까?더 많은 복싱 매개 변수 또는 매개 변수 배열을 할당하는 것은 무엇입니까?

void LogParams(string format, params object[] args) 
{ 
} 

void LogArgs(string format, object arg0, object arg1, object arg2) 
{ 
} 

LogParams("Hello, {0}, {1}, {2}", "Tom", "Dick", "Harry"); 
LogArgs("Hello, {0}, {1}, {2}", "Tom", "Dick", "Harry"); 

배경은()를 호출 나는 결국 및 String.format 졸이다 로그 메시지를 최적화하는 방법으로 찾고, 로그 메시지의 그러나 대부분은 본질적으로 함께 문자열에 가입하고 있습니다.

+4

'string'은 이미 참조 유형입니다. 권투는 관련이 없습니다. – xxbbcc

+3

그러나 더 많은 쓰레기를 생성하는 것이 무엇인지 알고 싶다면 두 조각을 프로파일하고 알아 내십시오. – Servy

+0

아, 미안, 네, 권투에 대한 나의 이해에 섞어 라. – JimmyDeemo

답변

0

우선, 복싱에 관련된 내용이 없습니다. string은 값 유형이 아니기 때문에 관련 항목이 없습니다.

첫 번째 방법은 세 개의 요소 (각 문자열 참조에 대해 하나)가있는 배열을 만들어야하기 때문에 더 많은 메모리를 사용합니다. 그런 다음 각 문자열이 만들어지고 참조가 배열에 할당됩니다. 메서드를 호출하기 전에 배열 refrence가 스택에 푸시됩니다.

다른 방법으로는 힙에 세 개의 문자열 만 생성됩니다. 메서드를 호출하기 전에 참조가 스택에 직접 푸시됩니다.

기본적으로 스택의 공간과 힙의 공간을 절약 할 수 있습니다. 그러나 어레이 생성은 추가 비용이 듭니다.

+0

그래, 지금이 모든 걸 볼 수있다. 나는 주로 문자열에 대해 혼란 스러웠다. 그래서 나는 그것이 섞여있는 곳이라고 생각한다. 답을 주셔서 감사한다. – JimmyDeemo

관련 문제