• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

ruby的字符串性能到底如何最佳

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
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是浅复制还是深度复制。


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


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Ruby中print、p、puts的区别发布时间:2022-07-14
下一篇:
Ruby学习笔记1(一个小时学会Ruby)发布时间:2022-07-14
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap