2012-07-12 33 views
0

我有一個自定義的小「視圖」引擎在T4中。基本上,它是採取與特殊指令「靜態」 HTML文件,並吐出類似:有沒有比StringBuilder更快的「參數化」字符串構建?

StringBuilder output... 
output.Append("<html> my code blah"); 
if(MyParameter!=null){ 
    output.Append(MyParameter.ToString); 
} 
output.append("more code"); 
return output.ToString(); 

當然,還有比這更給它,但是這是要點。它需要一個HTML文件並生成一個純舊的C#類。

我真的很喜歡這種方式,因爲我可以擁有靜態類型的視圖。不幸的是,這似乎有點慢。特別是我的問題是,我有一個index視圖,多個視圖包含blog entry視圖。因此基本上相同的基本字符串最終得到構建,只是基於提供的參數在這裏和那裏有幾個不同的文本。

無論如何,我想知道是否有任何方法來加速這個過程。有什麼比StringBuilder更快嗎?

另外,不要擔心「不潔淨」的代碼。因爲我使用T4來生成這些視圖類,所以我可以擁有一些漂亮的hack-ish代碼,並且它並不重要,因爲我基本上只寫了一次。

+1

這很模糊,不是嗎?至少要收集一些證據,證明它實際上是緩慢的建築商。 .NET GC perf計數器告訴你什麼?分析器告訴你什麼?沒有比StringBuilder更快的速度了,使用它的Capacity屬性在.NET 4上沒有太大的區別。別的東西你沒有提到。 – 2012-07-12 10:40:46

+0

據我所知,'StringBuilder'是推薦的有效構建字符串的方法。也許你可以使用流將文本直接發送到目的地,而不是將其構建爲字符串?也許它的T4很慢。 – 2012-07-12 11:28:31

回答

0

請指定創建的StringBuilder的容量。這將避免多個內存分配。例如:

var a = new StringBuilder(3000); 

其中,3000估計最終串

2

的大小有關的StringBuilder

  • 重用StringBuilder對象,而不是創建一個新的每一次的
  • 設置的容量StringBuilder爲最終字符串的最大大小。

替代

  • 創建所有posibble字符串列表,並根據參數值從中只選擇(如果有不可能太多排列)

而且

  • 基準你的代碼,因爲它不可能是建立字符串阻止你回來。我可以在單個內核上創建30萬個字符串/秒。
+0

用於重用StringBuilder對象。我在我的自定義JSON解析器中對其進行了描述,並且「新的StringBuilder」發生在「熱路徑」上。在將它重新排列爲StringBuilder和'sb.Clear()'的全局實例後,我的分析器速度提高了3倍。 – JustAMartin 2014-09-04 19:30:24

相關問題