2009-01-26 116 views
1

我傾向於使字符串的長度爲2(16,32,64)的冪。對於字符串類型的對象(如字符串變量,字符串集合或字符串類型的數據庫中的列)是否有任何優化優勢?這是在.net/sql服務器環境中。字符串變量和字符列的長度

回答

3

由於.NET字符串不是以null結尾的,所以您必須非常聰明才能真正消耗每個字符串中的完美字符數。

String message = "hello world!!!!!"; // Exactly 16 chars 

此外,當你的實現使用「malloc」執行內存分配時,字符串的兩次冪的大小隻是重要的。這是一種內存分配策略,它說:「我個人的內存和內存將更好地適應堆,浪費更少的空間,如果它們都具有兩個冪的大小」。

但.NET不使用malloc來分配內存。相反,所有堆內存都是通過增加堆指針來分配的。當GC稍後釋放內存時,它將執行堆壓縮,以便所有新內存都來自末端,並且它永遠不需要在碎片堆中找到一小塊內存。

1

不會。你會怎樣處理你沒有使用的字符串塊,因爲它只是填充。與任何嘗試對齊琴絃的節省相比,這種浪費的成本將顯着。 IT人員非常懷疑這樣的長度會有什麼好處。

0

這是一個優化可能沒有那麼有益的領域。我會根據需要定義長度,然後再回來並根據需要優化長度。我想你會發現字符串長度的默認處理就足夠了。

0

不是。兩次冪的優化優化來自數據庫時代的曙光,並且與數據在磁盤和內存中的對齊方式有關。今天,這是一個沒有好處的退化行爲。

2

對於數據庫中的列:請注意SQL的8kb數據頁。行越小,每個數據頁上可放置的行數就越多。每個數據頁可容納的行數越多,可讀取的行越快(頁數越少意味着IO數越少)。這適用於表格和索引。

以下是Wikipedia的更多信息。

1

C#/ .Net中的字符串是不可變的,因此在構建字符串時,預先分配空間以容納更多字符沒有任何意義(或任何方式)。如果附加到一個字符串,你會得到一個新的字符串,它會創建新的空間來保存整個新的字符串,而不會重新分配。就SQL列而言,如果您事先知道該字符串(char(N))或使用不同的字符數據(varchar(N)),則應將它們確定爲字符串的準確長度,並將N選作適合的最大值。我沒有看到保留這兩個權力的任何一點 - 當你創建一個varchar列時,SSMS默認爲50,所以顯然微軟也沒有。

預分配的一個地方可能會有所作爲,就像StringBuilder或預先分配集合的大小。同樣,它的大小應該與其大小無關,但如果知道它的實際使用量,則應該調整大小。如果不知道,那麼可以跳過初始尺寸或使其足夠大以容納大部分情況。