什么是字符串池机制

分析问题

  由于字符串的不可变性,程序中对用一字符串的大量修改或者对多个引用赋值同一字符串理论上会产生大量的临时字符串对象,这会极大程度地降低系统的性能。对于前者,可以使用StringBuilder类型来解决问题,这在前面章节中已经有所介绍了,而对于后者,.NET提供了另外一种不透明的机制来帮助优化性能,这就是字符串池机制,或者称为字符串的复用机制。

  一旦使用了字符串池机制,当CLR启动的时候,会在内部创建一个容器,容器的键是字符串内容,而值是字符串在堆栈上的引用。当一个新的字符串对象需要分配时,CLR首先检测内部容器中是否已经包含了该字符串对象,如果已经包含,则直接返回已经存在的字符串对象引用,如果不存在,则新分配一个字符串对象,同时把其添加到内容容器里去。但是当程序用new关键字显式地申明新分配一个字符串对象时,该机制将不会起作用。

  字符串池的设计本意是改善程序的性能,但是在有些情况下,这样的机制却可能产生负面效应,因为CLR额外地保留了一个存储字符串的容器,并且在每次进行字符串赋值时都需要额外地检查这个容器,可以想象,当某个系统刚好较少地或者根本没有使用到重复的字符串时,那字符串池这个机制只能引起额外的负面效应,而不能带来任何性能上的改善。考虑到这一点,.NET设计提供了字符串池的开关接口,如果程序集标记了一个System.Runtime.CompilerServices.CompilationRelaxationsAttribute特性,并且指定了一个System.Runtime.CompilerServices.ComilationRelaxations.NoStringInterning标志,那么CLR会不采用字符串池机制。

  对于CLR保存的字符串池的容器,程序员可以通过System.String类型的两个静态方法进行访问:

  public static string Intern(string s);  

  public static string IsInterned(string s);

  Intern方法返回了字符串s在字符串池容器中的对于引用,如果该字符串不存在于字符串池中,则会在字符串池中创建新的对象并且返回引用。IsInterned实现了基本类似的功能,它和Intern的区别是当字符串池不存在该字符串时,将不会分配新的对象,并且返回null。

答案

  字符串池机制致力于改善程序的性能。CLR会保留程序中出现过的字符串对象的集合,并且在需要新的字符串时,先检查已有的集合,在查找成功时返回已有对象的引用。

  字符串池机制可以通过程序集元数据特性进行控制,C#默认的机制是打开字符串池机制。

什么是字符串池机制

时间: 2024-11-07 00:45:56

什么是字符串池机制的相关文章

1.字符串池化(intern)机制及拓展学习

1.字符串intern机制 用了这么久的python,时刻和字符串打交道,直到遇到下面的情况: a = "hello" b = "hello" print(a is b) #--->True print(a == b) #---> True a = "hello world" b = "hello world" print(a is b) # ---> False print(a == b) # --->

正确理解 SqlConnection 的连接池机制[转]

作者: eaglet 转载请注明出处 .net 中通过 SqlConnection 连接 sql server,我们会发现第一次连接时总是很耗时,但后面连接就很快,这个其实和SqlConnection 的连接池机制有关,正确的理解这个连接池机制,有助于我们编写高效的数据库应用程序. 很多人认为 SqlConnection 的连接是不耗时的,理由是循环执行 SqlConnection.Open 得到的平均时间几乎为0,但每次首次open 时,耗时又往往达到几个毫秒到几秒不等,这又是为什么呢? 首先

(一)Python入门-2编程基本概念:18字符串-驻留机制-内存分析-字符串同一判断-值相等判断

一:字符串驻留 仅保存一份相同且不可变字符串的方法,不同的值被存放在字符串驻留池中. Python 支持字符串驻留机制,对于符合标识符规则的字符串(仅包含下划线(_).字母 和数字)会启用字符串驻留机制驻留机制. 二:字符串比较和同一性 我们可以直接使用==,!=对字符串进行比较,是否含有相同的字符. 我们使用is / not is,判断两个对象是否为同一个对象.比较的是对象的地址,即 id(obj1)是 否和 id(obj2)相等. 三:成员操作符 in /not in 关键字,判断某个字符(

【基础】Java 8 中的常量池、字符串池、包装类对象池

1 - 引言 2 - 常量池 2.1 你真的懂 Java的“字面量”和“常量”吗? 2.2 常量和静态/运行时常量池有什么关系?什么是常量池? 2.3 字节码下的常量池以及常量池的加载机制 2.4 是不是所有的数字字面量都会被存到常量池中?3 - 包装类对象池 $\ne$JVM 常量池4 - 字符串池 4.1 字符串池的实现——StringTable 4.2 字符串池存的是实例还是引用?5 - 补充 5.1 永久代为何被 HotSpot VM 废弃? 5.2 为什么 Java 要分常量.简单类型

字符串池

String a = "Hello"; String b = "Hello"; String c = new String("Hello"); String d = new String("Hello"); System.out.println(a == b); System.out.println(b == c); System.out.println(c == d); System.out.println(a.equals

日常总结 -- 字符串池

最近被人问到关于java字符串的问题,做了一点小的归纳先上经典代码: 1.String a = "Hello"; 2.String b = "Hello"; 3.String c = new String("Hello"); 4.String d = new String("Hello"); System.out.println(a == b); System.out.println(b == c); System.out.p

线程池机制使nginx性能提高9倍

原文标题:Thread Pools in NGINX Boost Performance 9x! 原文官方地址:https://www.nginx.com/blog/thread-pools-boost-performance-9x/ 本文为译文,非直译. 一.问题一般情况下,nginx 是一个事件处理器,一个从内核获取连接事件并告诉系统如何处理的控制器.实际上,在操作系统做读写数据调度的时候,nginx是协同系统工作的,所以nginx能越快响应越好. nginx处理的事件可以是 超时通知.so

Java字符串池(String Pool)深度解析

版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! 在工作中,String类是我们使用频率非常高的一种对象类型.JVM为了提升性能和减少内存开销,避免字符串的重复创建,其维护了一块特殊的内存空间,这就是我们今天要讨论的核心,即字符串池(String Pool).字符串池由String类私有的维护. 我们知道,在Java中有两种创建字符串对象的方式:1)采用字面值的方式赋值  2)采用new关键字新建一个字符串对象.这两种方式在性能和内存占用方面存在着差别. 方式一:采用字面值的方式赋值

Java 字符串池

所谓天下文章皆是抄,在网上找一个Java 字符串池的文章,搜到N多条目,可看来看去也就两篇,总结如下: 首先看一段代码: String a = "Hello"; String b = "Hello"; String c = new String("Hello"); String d = new String("Hello"); System.out.println(a == b); System.out.println(b =