문자열 보간 사용 사이에 눈에 띄는 성능 차이가 있습니까?
myString += $"{x:x2}";
대 String.Format ()?
myString += String.Format("{0:x2}", x);
Resharper가 수정을 요청하고 있기 때문에 요청하고 있으며 이전에 속아 본 적이 있습니다.
문자열 보간 사용 사이에 눈에 띄는 성능 차이가 있습니까?
myString += $"{x:x2}";
대 String.Format ()?
myString += String.Format("{0:x2}", x);
Resharper가 수정을 요청하고 있기 때문에 요청하고 있으며 이전에 속아 본 적이 있습니다.
답변:
주목할만한 것은 상대적입니다. 그러나 문자열 보간은 string.Format()
컴파일 타임에 변환되므로 동일한 결과를 얻게됩니다.
그러나 미묘한 차이가 있습니다. 이 질문 에서 알 수 있듯이 형식 지정자의 문자열 연결로 인해 추가 string.Concat()
호출이 발생합니다.
int
가 사용되는 경우) 문자열 연결로 컴파일 될 수 있습니다. var a = "hello"; var b = $"{a} world";
문자열 연결로 컴파일됩니다. var a = "hello"; var b = $"{a} world {1}";
문자열 형식으로 컴파일됩니다.
문자열 보간은 컴파일 타임에 string.Format ()으로 바뀝니다.
또한 string.Format에서 단일 인수에 대해 여러 출력을 지정하고 단일 인수에 대해 다른 출력 형식을 지정할 수 있습니다. 그러나 문자열 보간은 더 읽기 쉽습니다. 그래서 그것은 당신에게 달려 있습니다.
a = string.Format("Due date is {0:M/d/yy} at {0:h:mm}", someComplexObject.someObject.someProperty);
b = $"Due date is {someComplexObject.someObject.someProperty:M/d/yy} at {someComplexObject.someObject.someProperty:h:mm}";
몇 가지 성능 테스트 결과가 있습니다 https://koukia.ca/string-interpolation-vs-string-format-string-concat-and-string-builder-performance-benchmarks-c1dad38032a
String::Format
. 때로는 String::Concat
. 그리고 그 페이지의 성능 테스트는 실제로 의미가 없습니다. 각 메소드에 전달하는 인수의 양은 종속적입니다. concat이 항상 가장 빠른 것은 아니며 stringbuilder가 항상 가장 느린 것은 아닙니다.
문제는 성능에 관한 것이지만 제목에 "vs"라고만 적혀 있으므로 몇 가지 사항을 더 추가해야한다고 생각합니다. 일부는 의견이 있습니다.
현지화
string.Format
. 그러나이를위한 도구가 있습니다 (예 :) ReSharper
.유지 보수 가능성 (내 의견)
string.Format
예를 들어 멋지고 의미있는 오류 메시지를 생성 할 때 내가 표현하고 싶은 문장에 초점을 맞추기 때문에 훨씬 더 읽기 쉽습니다. {N}
자리 표시자를 사용하면 더 많은 유연성을 얻을 수 있으며 나중에 수정하기가 더 쉽습니다.string.Format
이것에 훨씬 덜 취약합니다.그래서 이것들을 기반으로 string.Format
대부분의 코드 를 고수하기로 결정했습니다 . 하지만 더 유창하게 코딩 할 수 있도록 확장 방법을 준비했습니다 . 확장 프로그램의 구현은 한 줄로되어 있으며 사용중인 것처럼 보입니다.
var myErrorMessage = "Value must be less than {0:0.00} for field {1}".FormatWith(maximum, fieldName);
보간은 훌륭한 기능입니다. 오해하지 마십시오. 그러나 IMO는 string.Format
JavaScript와 같은 유사한 기능 을 놓친 언어에서 가장 빛납니다 .
{3}
특히 형식을 재정렬하기 시작하는 경우 X인지 Y 인지 알아내는 것이 여전히인지 적 부하라고 생각 합니다. Madlibs 예 : $"It was a {adjective} day in {month} when I {didSomething}"
대 string.Format("It was a {0} day in {1} when I {2}", adjective, month, didSomething)
-> $"I {didSomething} on a {adjective} {month} day"
대string.Format("I {2} on a {0} {1} day", adjective, month, didSomething)
string.Format
내가 생각하는 당신은 훨씬 적은 경향이 문제입니다. 그러나 어쨌든, 이것이 내가 그것이 내 의견이라고 강조한 이유입니다. :)