zoukankan      html  css  js  c++  java
  • [VB.NET Tips]再谈字符串连接之内置池

    CLR自动维护一个称为”内置池“(暂存池)(intern pool)的表,在编译时此表包含程序中声明的每个唯一的字符串常量的单个实例,以及以编程方式创建的String类的任何唯一实例。
    内置池被实现为散列表。使用散列表即表示,一个字符串可以通过一个数字或”散列码“来表示。这样比较和搜索字符串就非常有效,因为这不是逐个字符比较字符串,而仅仅比较散列值。
    内置池节省字符串存储空间。如果将一个字符串常量赋给几个变量,则每一个变量引用内置池中相同的常量,而不是引用具有相同值的String类的几个不同实例。

    可以测试如下代码:

    
        Const APPNAME As String = "运维应用程序"
    
        Console.WriteLine(String.IsInterned(APPNAME) <> Nothing)
    
        Dim s1 As String
        Dim s2 As String
    
        s1 = "这是一个测试的字符串"
        s2 = "这是一个测试的字符串"
    
    
        Console.WriteLine(String.IsInterned(s1) <> Nothing)
        Console.WriteLine("s1的散列值:{0}", s1.GetHashCode())
        Console.WriteLine("s2的散列值:{0}", s2.GetHashCode())
    
        Dim s3 As String = s1 & DateTime.Now().ToString()
        Console.WriteLine("s3的散列值:{0}", s3.GetHashCode())
        Console.WriteLine(String.IsInterned(s3) <> Nothing)
    
    

    运行以下代码会发现.NET会内置了包含字符串常量,以及编程方式创建的字符串。
    会发现s1和s2引用同个字符串实例。s3不会被内置,因为在编译时并不能确认s3的具体内容。也可以使用String.Intern强制内置一个变量。
    用图来表示一下:

    那么内置有什么好处呢,对比下面的代码,第二个方法比第一个方法快3倍以上。

    
         Sub Main()
            Console.Write("请输入你的名字:")
            Dim userName As String = Console.ReadLine()
    
            Method1(userName)
            Method2(userName)
    
            Console.Read()
    
        End Sub
    
        Public Sub Method1(ByVal username As String)
    
            Dim strHTML As String
    
            '每次循环创建3次字符串,分配3次内存
            Dim startms As Integer = Environment.TickCount()
            For i As Integer = 1 To 1000000
                strHTML = "<HTML><HEAD></HEAD><BODY>"
                strHTML &= "我的名字是:"
                strHTML &= username
                strHTML &= "</BODY></HTML>"
            Next
            Dim endms As Integer = Environment.TickCount()
    
            Console.WriteLine("总耗时:{0}微秒", (endms - startms))
    
        End Sub
        Public Sub Method2(ByVal username As String)
    
            Dim strHTML As String
            Const strPrefix As String = "<HTML><HEAD></HEAD><BODY>"
            Const strSuffix As String = "</BODY></HTML>"
    
            '只创建一次字符串
            Dim startms As Integer = Environment.TickCount()
            For i As Integer = 1 To 1000000
                strHTML = strPrefix & "请输入你的名字:" & userName & strSuffix
            Next
            Dim endms As Integer = Environment.TickCount()
    
            Console.WriteLine("总耗时:{0}微秒", (endms - startms))
    
        End Sub
    
    

    以上方法只是抛砖引玉,在实际应用中灵活应用。在一些web应用程序中有大量字符串拼接操作的,可以多使用内置。毕竟处理速度快,能够处理的并发就越高。

  • 相关阅读:
    【Vue】详解Vue生命周期
    千万不要用window自带文本编辑器编辑配置文件或者代码
    [其它]iOS 13 正式版发布 iPhone 6s或更新型号均可升级
    [转]解决ubuntu16.04 ‘E: 无法获得锁 /var/lib/dpkg/lock-frontend
    [golang]使用gomail发邮件(在Go中发送电子邮件的最佳方式)
    [golang]按图片中心旋转后的新图左顶点和原图左顶点的偏移量计算
    分布式CAP定理,为什么不能同时满足三个特性?
    Java如何运行一个class文件的main方法
    数据库的四大特性以及四个隔离级别和引发的问题
    Redis为什么可以支持那么大的并发访问量?为什么redis没有单点并发瓶颈?
  • 原文地址:https://www.cnblogs.com/tengwei6328/p/11415692.html
Copyright © 2011-2022 走看看