我倾向于使字符串的长度为2的幂(16,32,64)。对字符串类型的对象(例如字符串变量,字符串集合或字符串类型的数据库中的列)执行此操作是否有任何优化优势?这是在.net / sql服务器环境中。
答案 0 :(得分:3)
由于.NET字符串不是以空值终止的,因此您必须非常聪明才能在每个字符串中实际使用完整数量的字符。
String message = "hello world!!!!!"; // Exactly 16 chars
此外,当您的实现使用“malloc”执行内存分配时,字符串的二次幂大小才重要。这是一种内存分配策略,它说“我的个人内存和内存将更好地融入堆中,浪费更少的空间,如果它们都具有两种容量的大小”。
但.NET不使用malloc来分配内存。而是通过递增堆指针来分配所有堆内存。当GC稍后释放内存时,它将执行堆压缩,以便所有新内存都来自最终,并且它永远不需要在碎片堆中找到一小块内存。
答案 1 :(得分:2)
对于数据库中的列:注意SQL的8kb数据页。行越小,每个数据页面上可以容纳的行数就越多。每个数据页中可以容纳的行越多,可以读取的行越快(更少的页面意味着更少的IO)。这适用于表 - 和索引。
以下是来自Wikipedia的更多信息。
答案 2 :(得分:1)
没有。对于你没有使用的大块字符串你会做什么,因为它只是填充。与试图对齐字符串时可能存在的任何节省相比,这种浪费的成本将是巨大的。非常怀疑这样的长度无论如何都会有任何好处。
答案 3 :(得分:1)
C#/ .Net中的字符串是不可变的,因此在构造字符串时,没有任何意义(或任何方式)预分配空间以容纳更多字符。如果附加到字符串后会返回一个新字符串,它会创建新空间来保存整个新字符串并且不会重新分配。就SQL列而言,如果您事先知道它(char(N))或使用不同的字符数据(varchar(N)),则应将它们设为字符串的确切长度,并选择N作为合适的最大值。我认为保持这两种能力没有任何意义 - 当您创建varchar列时SSMS默认为50,所以显然Microsoft也没有。
预分配可能会产生影响的地方是StringBuilder或预先分配集合的大小。同样,它的大小应该是不必调整大小的目标,但如果已知则接近其实际使用。如果不知道,那么要么跳过初始尺寸,要么使其足够大以容纳大部分情况。
答案 4 :(得分:0)
这是一个优化可能不那么有益的领域。我会根据需要定义长度,然后稍后再回来并根据需要优化长度。我想你会发现字符串长度的默认处理就足够了。
答案 5 :(得分:0)
没有。二次幂大小优化来自数据库时代的曙光,与数据在磁盘和内存中的对齐方式有关。今天,这是一种没有任何优势的退化行为。