2013-08-01 3 views
7

어느 쪽이 더 잘 작동 하나 정확합니까? StreamWriter 클래스에서 개체를 만들고 메서드에서 자주 사용하고 마지막으로 처리하는 것이 더 좋습니까? 또는 StringBuilder의 객체를 사용하고 StreamWriter에서 객체를 생성하고 즉시 처리하는 것이 더 낫습니까?Streamwriter vs StringBuilder

1)

var Write = new StreamWriter(string.Format("{0}{1}{2}", Environment.CurrentDirectory, Path.DirectorySeparatorChar, "Dummy.txt")); 
for (int i = 0; i < 100; i++) 
{ 
    //Do something include calculation 
    Write.WriteLine(something); 
} 
Write.Flush(); 
Write.Dispose(); 

2)

var Str = new StringBuilder(); 
for (int i = 0; i <  100; i++) 
{ 
    //Do something include calculation 
    Str.AppendLine(something); 
} 
var Write = new StreamWriter(string.Format("{0}{1}{2}", Environment.CurrentDirectory, Path.DirectorySeparatorChar, "Dummy.txt")); 
Write.Write(Str); 
Write.Flush(); 
Write.Dispose(); 
+8

돈 ' 'Path.Combine (Environment.CurrentDirectory, "Dummy.txt")'를 사용하여 경로에'string.Format'을 사용하지 마십시오. – Alxandr

+3

즉시'폐기 '를 위해'using() {}'구조체를 사용하는 방법을 연구하려고 시도합니다 – MethodMan

+0

streamWriters에서'using '블록을 사용하십시오 : http://stackoverflow.com/questions/212198/what-is-the-c- 날카로운 사용 - 블록 - 그리고 왜 - 사용해야 - 그것 - – 5uperdan

답변

9

첫 번째 잠재적으로 더 많은 IO 작업을 사용하지만 메모리가 적습니다. 두 번째는 모든 것을 메모리에 버퍼링해야합니다. 그것은 문제 일 수도 있고 아닐 수도 있습니다. 문제의 을 무엇

당신이 using 문 또는 try/finally를 사용하지 않을 것을, 그리고 당신이 string.Format를 사용하고 있다는 점이다.

내가 제안 :

// Note the more conventional variable names, too... 
string file = Path.Combine(Environment.CurrentDirectory, "Dummy.txt"); 
using (var writer = File.CreateText(file)) 
{ 
    for (int i = 0; i < 100; i++) 
    { 
     writer.WriteLine(...); 
    } 
} 

또한, 당신이 쓰고있어하는 것은 자연스럽게 LINQ 쿼리 (또는 다른 IEnumerable<string>)로 표현되는 경우 그냥 File.WriteAllLines를 사용할 수 있습니다

var query = ...; // Something returning an IEnumerable<string> 
var file = Path.Combine(Environment.CurrentDirectory, "Dummy.txt"); 
File.WriteAllLines(file, query); 
3

정말 응용 프로그램의 상황에 따라 달라집니다. 예를 들어 다른 프로그램에서 해당 스트림에서 나오는 내용을 듣고 동시에 데이터를 처리 할 수있는 경우 첫 번째 방법을 사용하는 것이 좋습니다.

즉, 저장 용 텍스트 파일에 물건을 쓰는 경우 두 번째 옵션을 사용할 가치가 있습니다. 제 생각에는 두 번째 옵션이 매우 빠르게 실행될 것입니다. StringBuilder은 매우 빠르며 첫 번째 옵션과 반대로 한 번의 쓰기 작업 만 수행합니다. 첫 번째 옵션과는 달리 각 쓰기에 대해 새 개체를 지속적으로 만듭니다.