예를 들어, I have a 가 C # 에서 스트라이베이더 이:
StringBuilder sb = new StringBuilder();
string cat = "cat";
sb.Append("the ").Append(cat).(" in the hat");
string s = sb.ToString();
더 이상 할 수 있는 효율적인 또는 고효율의 as 아니하였으매 있다.
string cat = "cat";
string s = String.Format("The {0} in the hat", cat);
그렇다면, 왜?
몇 가지 흥미로운 것을 알게 된 후, 나는 내가 좀 더 명확한 답을 이미 있는 것을 해야 했다. 내가 너무 빨리 wasn& # 39, t 가 요구하고 있지만, 이는 다른 영역으로 빠르게 dell. injecting 문자열으로 http://support. 연결하면 한 문자열이어야.
위의 두 경우 모두 투입할 수 있는 하나 이상의 문장열 가운데로 난 로렌아줌마가 미리 정의된 템플리트를 구체화하십시오.
이런 혼란을
'는' '' 스테링스포르마 스트라이베이더 내부적으로:
public static string Format(IFormatProvider provider, string format, params object[] args)
{
if ((format == null) || (args == null))
{
throw new ArgumentNullException((format == null) ? "format" : "args");
}
StringBuilder builder = new StringBuilder(format.Length + (args.Length * 8));
builder.AppendFormat(provider, format, args);
return builder.ToString();
}
위의 코드는 스니핏 스트라이버일드리아펜드 () 는 ',' 에서 마스코리브 질문이 제기될 수 있기 때문에, " 스트라이버일드리아펜드포르마 () '보다' ",?
아마도 위의 예제 코드를 실행할 것이라고 말하는 벤치마킹 I& 없이; d # 39 더 빨리 지아펜드 사용하여 ' ()'. 하지만, s # 39 it& 시도하시겠습니까 벤치마킹 및 / 또는 프로필링 두 추측은 afaq 적절한 비교.
이 chap, 제리 딕슨씨 일부 벤치마킹 하지 않았다.
>. http://jdixon.dotnetdevelopersjournal.com/string_concatenation_stringbuilder_and_stringformat.htm
위의 링크를 안타깝게도 이후 사망하였다. 그러나 여전히 복제본에 there& # 39 의 돌아오는 길에 시스템:
//jdixon.dotnetdevelopersjournal.com/string_concatenation_stringbuilder_and_stringformat.htm >, http://web.archive.org/web/20090417100252/http
그 날이 끝날 수 있는가에 달려 것, 즉 you& # 39 라는 문자열을 포맷은 일부 erious 텍스트 처리 하고, re 통해 반복적으로 들립니다 100& # 39, s, s, 아니면 mb 의 텍스트 it& # 39 라는 버튼을 클릭할 때, 지금 다시 있다. # 39, 일괄 처리 작업을 하면서 큰 일을 한 you& 일부 I& 스테링스포르마 치중한다는; d # 39 이 에이즈 코드 가독성과 검사에. 병목 현상을 볼 수 있는 코드 a 는 성능 상의 후 스틱 의심되면 프로필러 정말 있다.
[MSDN 문서용으로] 에서 1:
>. 객체 연결 문자열 (string) 또는 스트라이베이더 의 성능을 작업에 따라 메모리 할당 얼마나 자주 발생합니다. 반면, 메모리 할당 연결 작업 전용 메모리 할당 연결 작업을 한 항상 문자열으로 스트라이베이더 스트라이베이더 객체에는 경우 수용할 수 있는 새로운 데이터 버퍼 너무 작아. 이에 따라 일정한 수의 연결 문자열을 String 클래스에 대한 경우 작업 객체에는 연결된 것이 좋습니다. 이 경우, 심지어 개별 연결 작업을 한 번에 의해 컴파일러와의 결합될 수 있습니다. 객체 연결 작업을 한 스트라이베이더 의 경우, 임의의 개수의 문장열 연결된 것이 좋습니다 예를 들어, 임의의 수의 문장열 루프 연결 사용자 입력입니다.
만약 단지 구체화하십시오. # 39 이것은 정확히 뭘 그렇게 생각할 수 있습니다, t doesn& 포맷하십시오 재실행할 테스트 중 6 년 후인 Net45.
하지만 지금 concat 여전히 빠른 it& # 39 의 30% 를 넘지 않는 것입니다. 겨우 5-10% 스트라이베이더 및 형식에 따라 다릅니다. 나는 attaboy 형태로 테스트 실행 몇번이요 20%
밀리초입니다, 백만 이터레이션에:
성능 차이가 나는 것은 그렇게 간단한 주는 교훈은 일부를빼앗기 shouldn& # 39, t stop 너회가 먹어서나 가장 간단한 코드를 읽을 수 있습니다. 항상 내 돈이 아닌 'a + b + c' 하는 경우가 많습니다.
const int iterations=1000000;
var keyprefix= this.GetType().FullName;
var maxkeylength=keyprefix + 1 + 1+ Math.Log10(iterations);
Console.WriteLine("KeyPrefix \"{0}\", Max Key Length {1}",keyprefix, maxkeylength);
var concatkeys= new string[iterations];
var stringbuilderkeys= new string[iterations];
var cachedsbkeys= new string[iterations];
var formatkeys= new string[iterations];
var stopwatch= new System.Diagnostics.Stopwatch();
Console.WriteLine("Concatenation:");
stopwatch.Start();
for(int i=0; i<iterations; i++){
var key1= keyprefix+":" + i.ToString();
concatkeys[i]=key1;
}
Console.WriteLine(stopwatch.ElapsedMilliseconds);
Console.WriteLine("New stringBuilder for each key:");
stopwatch.Restart();
for(int i=0; i<iterations; i++){
var key2= new StringBuilder(keyprefix).Append(":").Append(i.ToString()).ToString();
stringbuilderkeys[i]= key2;
}
Console.WriteLine(stopwatch.ElapsedMilliseconds);
Console.WriteLine("Cached StringBuilder:");
var cachedSB= new StringBuilder(maxkeylength);
stopwatch.Restart();
for(int i=0; i<iterations; i++){
var key2b= cachedSB.Clear().Append(keyprefix).Append(":").Append(i.ToString()).ToString();
cachedsbkeys[i]= key2b;
}
Console.WriteLine(stopwatch.ElapsedMilliseconds);
Console.WriteLine("string.Format");
stopwatch.Restart();
for(int i=0; i<iterations; i++){
var key3= string.Format("{0}:{1}", keyprefix,i.ToString());
formatkeys[i]= key3;
}
Console.WriteLine(stopwatch.ElapsedMilliseconds);
var referToTheComputedValuesSoCompilerCantOptimiseTheLoopsAway= concatkeys.Union(stringbuilderkeys).Union(cachedsbkeys).Union(formatkeys).LastOrDefault(x=>x[1]=='-');
Console.WriteLine(referToTheComputedValuesSoCompilerCantOptimiseTheLoopsAway);
내가 생각하는 가장 우려하는 것은 대부분의 경우 이 같은 명확성, 효율성, 너회의 합니다. # 39 만 t 의 문장열 you& 않는 한, re 낮은 전원 공급 장치, 또는 건물 함께 전망이다 뭔가 큰 차질이 빚어질 수 있도록, t 모바일 # 39 이 아마도 won& 너회의 실행하십시오 속도.
반면, re 얘기를 you& # 39 경우 2 ~ 3 개의 큰 청크에는 정적임 텍스트에서처럼 com/go/4e6b330a_kr 항목이없습니다 it& # 39 의 경우에도 선명도를 너회가 얻을 수 있는 효율적인 것 같아 조금 덜 구체화하십시오. 형식을 통한 it worth it. 내가 이 때 사용할 수 있어 이번 주 초 4 페이지 중앙에 1 비트 배치하십시오 동적 텍스트 문서. # 39 는 텍스트, ll be it& 업데이트하려면 청크에는 한 것보다 더 큰 경우 3 냥이라구 업데이트하려면 블렌드합니다 연결 함께 합니다.
'Internally.so' 스트라이베이더 스테링스포르마 /dev/raw/raw1 논리적으로 이어지는 있다는 점이 더 강력한 약간만이라도 조금 덜 인해 오버헤드에. 그러나 둘 사이에 가장 빠른 방법 중 (others.by) 는 간단한 문자열 연결 문자열을 투입할 상당한 학위를 받았다. 이 증거는 매우 격렬한 시위를 통해 자신의 첫 공연의 퀴즈, 년전인데다 마리아니 있었다. 간단한 부품 수를 콩카티나티언스트웨인 사실은 잘 알려져 있다 (할 수 없이 a thousand 리미테이션.유 연결 문자열 (parts.as) 는 항상 긴 아시다시피 1000년 부품) '또는' 스트라이베이더 스테링스포르마스 이어 항상 빠릅니다. 그들은 하나의 메모리 할당 메모리 복제본에 한 일련의 수행할 수 있습니다. Here 은 대비성
일부 스트린g. 콩카트 avamar 는 실제 코드를 사용하는 방법, 이는 결국 필스트링케크트 호출하십시오 복제본에 가리키는 메모리 (통해 추출됨 Reflector):
public static string Concat(params string[] values)
{
int totalLength = 0;
if (values == null)
{
throw new ArgumentNullException("values");
}
string[] strArray = new string[values.Length];
for (int i = 0; i < values.Length; i++)
{
string str = values[i];
strArray[i] = (str == null) ? Empty : str;
totalLength += strArray[i].Length;
if (totalLength < 0)
{
throw new OutOfMemoryException();
}
}
return ConcatArray(strArray, totalLength);
}
public static string Concat(string str0, string str1, string str2, string str3)
{
if (((str0 == null) && (str1 == null)) && ((str2 == null) && (str3 == null)))
{
return Empty;
}
if (str0 == null)
{
str0 = Empty;
}
if (str1 == null)
{
str1 = Empty;
}
if (str2 == null)
{
str2 = Empty;
}
if (str3 == null)
{
str3 = Empty;
}
int length = ((str0.Length + str1.Length) + str2.Length) + str3.Length;
string dest = FastAllocateString(length);
FillStringChecked(dest, 0, str0);
FillStringChecked(dest, str0.Length, str1);
FillStringChecked(dest, str0.Length + str1.Length, str2);
FillStringChecked(dest, (str0.Length + str1.Length) + str2.Length, str3);
return dest;
}
private static string ConcatArray(string[] values, int totalLength)
{
string dest = FastAllocateString(totalLength);
int destPos = 0;
for (int i = 0; i < values.Length; i++)
{
FillStringChecked(dest, destPos, values[i]);
destPos += values[i].Length;
}
return dest;
}
private static unsafe void FillStringChecked(string dest, int destPos, string src)
{
int length = src.Length;
if (length > (dest.Length - destPos))
{
throw new IndexOutOfRangeException();
}
fixed (char* chRef = &dest.m_firstChar)
{
fixed (char* chRef2 = &src.m_firstChar)
{
wstrcpy(chRef + destPos, chRef2, length);
}
}
}
그럼.
string what = "cat";
string inthehat = "The " + what + " in the hat!";
즐거운 시간 되세요!
정말 사용 패턴을 따라 다릅니다. '간', '문자열, Concat' 와 '세부 벤치마트 스테링스타인 스테링스포르마' 여기서 찾을 수 있습니다. # 39, t 적합한 스테링스포르마 Isn& 집약형에 로깅하기
난 그렇지 않은 연결을 위한 설계 이후 제안하세요 스테링스포르마 설계됨 전송되었기 서식 출력물에는 등 다양한 투입물 데이트.
String s = String.Format("Today is {0:dd-MMM-yyyy}.", DateTime.Today);