我傾向於使字符串的長度爲2(16,32,64)的冪。對於字符串類型的對象(如字符串變量,字符串集合或字符串類型的數據庫中的列)是否有任何優化優勢?這是在.net/sql服務器環境中。字符串變量和字符列的長度
回答
由於.NET字符串不是以null結尾的,所以您必須非常聰明才能真正消耗每個字符串中的完美字符數。
String message = "hello world!!!!!"; // Exactly 16 chars
此外,當你的實現使用「malloc」執行內存分配時,字符串的兩次冪的大小隻是重要的。這是一種內存分配策略,它說:「我個人的內存和內存將更好地適應堆,浪費更少的空間,如果它們都具有兩個冪的大小」。
但.NET不使用malloc來分配內存。相反,所有堆內存都是通過增加堆指針來分配的。當GC稍後釋放內存時,它將執行堆壓縮,以便所有新內存都來自末端,並且它永遠不需要在碎片堆中找到一小塊內存。
不會。你會怎樣處理你沒有使用的字符串塊,因爲它只是填充。與任何嘗試對齊琴絃的節省相比,這種浪費的成本將顯着。 IT人員非常懷疑這樣的長度會有什麼好處。
這是一個優化可能沒有那麼有益的領域。我會根據需要定義長度,然後再回來並根據需要優化長度。我想你會發現字符串長度的默認處理就足夠了。
不是。兩次冪的優化優化來自數據庫時代的曙光,並且與數據在磁盤和內存中的對齊方式有關。今天,這是一個沒有好處的退化行爲。
對於數據庫中的列:請注意SQL的8kb數據頁。行越小,每個數據頁上可放置的行數就越多。每個數據頁可容納的行數越多,可讀取的行越快(頁數越少意味着IO數越少)。這適用於表格和索引。
以下是Wikipedia的更多信息。
C#/ .Net中的字符串是不可變的,因此在構建字符串時,預先分配空間以容納更多字符沒有任何意義(或任何方式)。如果附加到一個字符串,你會得到一個新的字符串,它會創建新的空間來保存整個新的字符串,而不會重新分配。就SQL列而言,如果您事先知道該字符串(char(N))或使用不同的字符數據(varchar(N)),則應將它們確定爲字符串的準確長度,並將N選作適合的最大值。我沒有看到保留這兩個權力的任何一點 - 當你創建一個varchar列時,SSMS默認爲50,所以顯然微軟也沒有。
預分配的一個地方可能會有所作爲,就像StringBuilder或預先分配集合的大小。同樣,它的大小應該與其大小無關,但如果知道它的實際使用量,則應該調整大小。如果不知道,那麼可以跳過初始尺寸或使其足夠大以容納大部分情況。
- 1. 將可變長度字符串分配給固定長度字符串
- 2. 將字符串變量拆分爲指定長度的隨機子字符串
- 3. unicode字符串的長度
- 4. 長SQL字符串中的Python變量
- 5. 字符串的固定長度排列
- 6. ASP - 如何在長字符串中插入字符串變量?
- 7. 如何打印單個字符的可變長度字符串
- 8. 創建一個變量來測量字符串的長度
- 9. 字符串變量比實際文件長度更長
- 10. C#可變長度字符串數組
- 11. 可變長度TSQL子字符串
- 12. 字符串長度突然變化
- 13. printf字符串,可變長度項目
- 14. numpy recarray可變長度字符串
- 15. 插入「 - 」字符串長度可變
- 16. 與字符替換可變長度字符串匹配原始字符串長度
- 17. 將字符串變量轉換爲長
- 18. 時刻字符串長度
- 19. 自動字符串長度
- 20. 字符串長度問題
- 21. 比較字符串長度
- 22. C字符串長度
- 23. 字符串長度問題
- 24. Firebase logEvent字符串長度
- 25. Java Unicode字符串長度
- 26. Rails Json字符串長度
- 27. 字符串長度問題
- 28. 限制字符串長度
- 29. 獲取字符串的字節長度
- 30. 一個字符串的字節長度