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是浅复制还是深度复制。
字符串的性能取决于操作字符串的内存的开销与否。
分类:
ruby on rails
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架