zoukankan      html  css  js  c++  java
  • ruby的字符串性能到底如何最佳

    1.先看字符串的object_id
    str1="Anleb"
    str2="Anleb"
    puts str1.object_id
    puts str2.object_id
    

    输出:
    22952500
    22952490

    id不同说明,虽然对象的值一样,但是他们是不同的东西,什么是不同的东西,也就是指针不同。
    str1指针----> 对象
    str2指针----> 对象

    题外话:不像咱们的c#、java有字符串驻留技术,ruby没有驻留技术的String对象,但是有驻留技术的Fixnum,false,true,不信,我实验给你看

    s1=false
    s2=false
    
    s3=true
    s4=true
    
    s5=1
    s6=1
    
    puts s1.object_id
    puts s2.object_id
    puts s3.object_id
    puts s4.object_id
    puts s5.object_id
    puts s6.object_id
    

     输出:
    0
    0
    2
    2
    3
    3
    驻留技术在ruby也存在,但是不同于其他语言,它是利用“符号”这种技术实现,简单说一下吧,毕竟这篇不是针对符号来说的:

    n1=:"id"
    n2=:id
    p n1.object_id
    p n2.object_id
    

     输出:
    30498
    30498

    第一结论:字符串多次出现为了性能,能用符号表示尽量用符号表示。

    2.再看字符串的相加

    str1="Anleb"
    puts str1
    puts str1.object_id
    #22952460
    
    str1=str1+"boy"
    puts str1
    puts str1.object_id
    #22952430
    

     说明字符串相加是产生新的对象

    str1="Anleb"
    puts str1
    puts str1.object_id
    #22952460
    
    
    str1=str1 << "boy"
    puts str1
    puts str1.object_id
    #22952460
    

     说明利用 << 却不会New出新的对象,也减少了内存的开销

    题外话:+= << concat的性能测试

    require 'benchmark'
    n1="abc"
    n2="abc"
    n3="abc"
    Benchmark.bm do |bm|
        bm.report("<<") do 
             10000.times {n1 << "abc"}
        end
    
        bm.report("+=") do 
             10000.times { n2+="abc"}
        end
         bm.report("concat") do 
             10000.times { n3.concat("abc")}
        end
        
    end
    输出:
          user     system      total        real
    <<  0.000000   0.000000   0.000000 (  0.000000)
    +=  0.187000   0.063000   0.250000 (  0.266000)
    concat  0.016000   0.000000   0.016000 (  0.015000)
    

     
    第二结论:字符串尽量使用<< 相加,减少开销。

    3.再说"!"
    大家都知道方法后面带 ! 是危险的操作,可是到底为什么危险呢?

    str1="anleb"
    puts str1
    puts str1.object_id
    
    
    str2=str1.capitalize
    puts str1
    puts str2
    puts str2.object_id
    
    
    str3=str1.capitalize!
    puts str1
    puts str3
    puts str3.object_id
    

     输出:
    anleb
    22951930
    anleb
    Anleb
    22951910
    Anleb
    Anleb
    22951930

    先看id,不带!返回的是一个新的字符串,带!是返回修改后的原字符串本身。

    4.最后说字符串的复制

    str1="Anleb"
    str2=str1
    p str1.object_id
    p str1.object_id
    
    
    str3=str1.clone
    p str3.object_id
    
    str4=str1.dup
    p str4.object_id
    
    str5=String.new(str1)
    p str5.object_id
    

     输出:
    22951960
    22951960
    22951930
    22951910
    22951890

    str1与2相等大家都知道,他们是引用复制,这里不谈论clone、dup、String.new是浅复制还是深度复制。


    字符串的性能取决于操作字符串的内存的开销与否。

  • 相关阅读:
    03-HTML之body标签
    02-HTML之head标签
    01-HTML介绍
    第十五章 并发编程
    第十四章 网络编程
    第十三章 模块和包
    第十二章 异常和错误
    第十一章 面向对象进阶
    第九章 常用模块(续)
    003 配置负载均衡
  • 原文地址:https://www.cnblogs.com/IAmBetter/p/2963692.html
Copyright © 2011-2022 走看看