`
Anleb
  • 浏览: 32776 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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是浅复制还是深度复制。


字符串的性能取决于操作字符串的内存的开销与否。
3
9
分享到:
评论
1 楼 superheizai 2012-09-23  
我是新人,驻留在看书阶段的新人,所以我要说错了,请不要怪我。对于上文提到的驻留,只有int有,float是没有的,所以不能用fixnum来描述这个问题吧。

相关推荐

    Ruby中的字符串编写示例

    本文将深入探讨Ruby中字符串使用的最佳实践,并通过具体的示例来帮助读者更好地理解和掌握这些技巧。 #### 二、字符串插值 在Ruby中,字符串插值是一种非常实用的功能,它可以让你在字符串中嵌入变量或表达式的值...

    Programming Ruby

    2. **面向对象编程**:Ruby是完全面向对象的语言,一切皆对象,包括基本类型如整数、字符串和布尔值。类是对象的蓝图,实例是类的具体化。Ruby中的继承、封装和多态等面向对象概念被充分支持。 3. **动态性**:Ruby...

    ruby实战书、代码书.rar

    1. **Ruby基础**:书中会介绍Ruby的基本语法,包括变量、常量、数据类型(如字符串、数字、数组、哈希)、控制结构(如条件语句、循环)以及函数和方法的使用。 2. **面向对象编程**:Ruby是纯面向对象的语言,书中...

    Ruby - Ruby for Rails

    - **基本数据类型**:介绍 Ruby 中的基本数据类型,如整数、浮点数、字符串等。 - **核心类库**:探讨 Ruby 的核心类库,包括 Array、Hash、String 等类的功能及用法。 - **常用方法**:总结常用的核心类方法,如 ...

    Programming Ruby 1.9 (3rd edition)和源码

    - 强大的元编程:Ruby的`send`方法允许在运行时动态调用方法,`eval`可以执行字符串形式的代码,这使得Ruby在元编程方面极其灵活。 3. **Ruby的数据结构**: - 数组(Array):线性数据结构,支持索引访问和各种...

    Ruby-fastrubyRuby编写快速收集常见Ruby惯用语

    `fast-ruby` 展示了如何避免不必要的方法调用,如使用符号`:`代替字符串字面量,减少对象创建。 3. **数组和集合操作** Ruby的内建数组和哈希数据结构提供了丰富的操作,但不同的操作有不同的性能特性。`fast-ruby...

    ruby1.8.7版for linux

    2. **语法差异**: Ruby 1.9引入了一些语法改进,比如字符串字面量的变更(引号区分ASCII和Unicode字符串)、块参数的改进等,这些在1.8.7中是不支持的。 3. **安全性**: 随着时间的推移,Ruby 1.8.7可能暴露出一些...

    Ruby 技术手册(CHM 电子版)

    除此之外,书中可能还会涵盖一些高级主题,如并发编程(线程与进程)、Gem(Ruby的包管理器)的使用、性能优化技巧、调试工具和最佳实践。Ruby社区活跃,有许多优秀的开源项目和资源,了解如何参与和利用这些资源也...

    ruby和redis接口.zip

    Redis支持多种数据结构,如字符串(String)、哈希(Hash)、列表(List)、集合(Set)和有序集合(Sorted Set)。Ruby库提供了对这些数据结构的全面支持。例如,你可以用以下方式操作列表: ```ruby redis.lpush...

    ruby1.9.1文档和一本pdf

    2. **编码处理**:Ruby 1.9 开始强制处理字符串的编码问题,每个字符串都有自己的编码类型,这大大增强了对多语言文本的支持。`encoding`关键字可用于声明源代码的编码。 3. **块和 Proc 对象**:Ruby 1.9 中,块...

    Everyday Scripting With Ruby

    - **最佳实践**:分享Ruby编程的最佳实践,包括代码风格指南、性能优化技巧等。 #### 八、读者反馈 - **评价**:本书受到了读者的高度评价,特别是软件测试人员、分析师和程序员。他们认为这本书不仅教授了Ruby的...

    ruby大纲资料.txt

    Ruby的基本语法包括了对基本数据类型和变量的定义、数组、哈希和字符串的操作、正则表达式的使用、控制流和条件语句、循环、迭代器方法和函数。在Ruby中,数据类型包括数字、字符串、符号等,而变量和常量的使用也...

    Ruby200

    1. **面向对象**:Ruby 是一种纯面向对象的语言,这意味着每个数据都是一个对象,包括基本类型如整数、字符串和布尔值。每个对象都可以拥有方法,可以相互发送消息进行交互。 2. **动态类型**:变量在 Ruby 中不...

    ruby on rails资料

    学习Ruby时,需要掌握关键字、符号、字符串、数组、哈希等数据类型,以及如何进行异常处理和文件操作。 接着是“ruby中文文档”,这通常包括官方文档的中文版,涵盖了Ruby的各个方面,如标准库、API、语言规范等。...

    《Ruby从入门到精通》PDF版本下载.txt

    2. **数据类型**:包括数值类型(整型、浮点型等)、字符串、数组、哈希表等。 3. **控制结构**:介绍条件语句(if-else、unless)、循环语句(while、for)、流程控制(break、next等)。 4. **函数与方法**:函数...

    Ruby-Readthis基于Redis的高性能池化ActiveSupport兼容的缓存

    - **数据类型支持**:支持存储多种数据类型,包括字符串、哈希、列表、集合和有序集合等。 - **过期策略**:具备设置缓存过期时间的能力,实现自动清理旧数据。 2. **工作原理** Readthis的工作流程主要包括...

    learing ruby

    - **面向对象**:所有Ruby代码都是对象,即使是基本类型如整数和字符串也是对象。 - **动态类型**:变量不需要显式声明其类型,这使得Ruby代码更加灵活。 - **元编程能力**:Ruby允许程序员在运行时修改程序的行为,...

    Addison.Wesley.Ruby.Phrasebook.Sep.2008

    在Ruby中,字符串是极其重要的数据类型之一,广泛应用于各种场景。读者可以学习到如何连接字符串、提取子串、替换字符或模式以及使用正则表达式进行复杂的文本处理。这些技术对于开发Web应用、处理文件等内容非常...

Global site tag (gtag.js) - Google Analytics