2010-05-25 5 views
0

My C# (.NET 2.0) 응용 프로그램에는 2.5MB 용량의 StringBuilder 변수가 있습니다. 분명히, 큰 버퍼를 채울 때마다 더 큰 버퍼 공간에 복사하려고하지 않습니다. 이 시점에서 버퍼에 너무 많은 데이터가 있으므로 이전 데이터를 제거하는 것이 실용적인 옵션입니다. 누구나 내가이 일을 어떻게하는지에 대한 명백한 문제를 볼 수 있습니까? (즉, 제가 해결할 수있는 것보다 더 많은 성능 문제를 도입하고 있습니다.) 아니면 괜찮아 보입니까?StringBuilder 리소스 관리

tText_c = new StringBuilder(2500000, 2500000); 

    private void AppendToText(string text) 
    { 
    if (tText_c.Length * 100/tText_c.Capacity > 95) 
    { 
     tText_c.Remove(0, tText_c.Length/2); 
    } 

    tText_c.Append(text); 
    } 

EDIT : 추가 정보 (밀리 초)에 새로운 데이터를 매우 빠르게 수신 본원에

직렬 연결을 통한. 이 새로운 정보를 여러 줄짜리 텍스트 상자에 너무 자주 배치하지 않으려 고하므로 응용 프로그램의 성능이 떨어 지므로 StringBuilder에 저장합니다. 가끔씩 응용 프로그램은 StringBuilder의 내용을 텍스트 상자에 복사하고 StringBuilder 내용을 지 웁니다.

+0

이것은 의미가 없습니다. StringBuilder에는 이전 데이터가 필요하지 않은 항목이 있습니다. –

+0

무엇을이 용도로 사용하십니까? – tzaman

+0

제발 .. 무엇을하고 싶니? –

답변

0

응용 프로그램 시퀀스 (그리고 나서 일부)를 한 번 통과시키기에 충분한 텍스트를 저장할만큼 큰 버퍼를 할당하여 성능 문제를 해결할 수있었습니다. 시퀀스가 (다시) 시작될 때마다 버퍼가 지워집니다.

1

실제로이 StringBuilder을 어떻게 사용하십니까? 사실은 당신이 그것에서 물건을 제거하는 당신이 버퍼의 일종으로 정말 사용하고 제안합니다.

이렇게 Remove을 호출하면 이미 버퍼의 두 번째 절반을 첫 번째 버퍼에 복사 할 것이므로 여전히 많은 복사 작업을 수행하고 있습니다.

StringBuilder을 사용하는 대신 문자열 순환 버퍼를 사용할 수 있습니까? 그러면 기존 데이터를 버리고 새로운 문자열로 대체하는 것이 거의 자유 롭습니다. 전체 문자열을 추가하는 대신 작성자에게 무엇인가를해야하며 가끔씩 (아마도) 모든 것을 단일 문자열로 변환해야합니까?

+0

'StringBuilder'는 나중에 여러 줄 텍스트 상자에 복사 할 ASCII 텍스트를 버퍼링하는 데 사용됩니다.텍스트 상자를 항상 업데이트 할 필요는 없습니다 (수천 번, 수천 번, 초 단위). 그리고 다시 그려야합니다. 그래서 'StringBuilder'에 텍스트를 추가합니다. –

+0

@ Jim Fell : 그렇습니다. 문자열의 순환 버퍼가 실제로 더 좋은 방법이 될 것 같습니다. –

+0

아니면 그냥 간단한 큐 –

0

stringstream 또는 memorystream을 대신 사용 하시겠습니까? 스트림에 쓸 수 있고 필요에 따라 스트림에서 읽을 수 있습니다.

StringBuilder가 커지도록 모든 종류의 문제를 볼 수 있습니다. 그 중 가장 큰 것은 대형 오브젝트 힙에있을 것입니다.

+0

Joel, 당신은'StringStream'의 예제를 제공 할 수 있습니까? 'MemoryStream'을 찾았지만, 내가 말할 수있는 것만 큼 근처에는 고정 된 버퍼 크기 만 허용됩니다. –

+0

@ 짐 -'System.IO.StringReader'를 C++ 일과 혼동하고있었습니다. memorystream에 관해서는, 그것은 고정 버퍼를 가지고 있지만, 그것이 스트림이기 때문에 버퍼는 버퍼로부터 읽혀지기 때문에 지워진다. –

1

는 "... 나중에 여러 텍스트 상자에 복사 할 ASCII 문자를 버퍼링하는 데 사용되는 ..."

귀하의 텍스트 상자에 당신이 ~ 200킬로바이트 ... 그것은 원 과거를 얻을 때 발작을해야 할 것입니다 실패하지는 않지만 그 성능은 돌처럼 떨어질 것입니다. ? 어떤 종류의 캐릭터 모음을 사용하는 컨트롤은 더 나은 아이디어 ... 어쩌면옵니다 ... 의사 예가 될 수 있습니다

public void AddText(string text){ 
    ListBox.items.add(text); 
    if(ListBox.items.count > 4096){ 
    ListBox.items[0].remove(); 
    } 
} 

"의 (수백, 수천하지 않을 경우 업데이트 할 ..need 초) 및 다시 그립니다. "

Ui 업데이트 속도가 ~ 50hz보다 좋지는 않습니다 ... 버퍼 구조에 영향을 미칠 수 있습니다.

+0

녹슨, 당신은 좋은 지적을 제기합니다. 지금 당장은 버퍼가 90 % ~ 95 %가 지워지므로 5 % -10 % 만 복사해야한다는 점을 제외하고는 본래의 방식으로 진행할 생각입니다. –