`
Anleb
  • 浏览: 31556 次
  • 性别: 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-Stringex一些实用的Ruby字符串扩展类

    Stringex 一些实用的Ruby字符串扩展类

    ruby的二进制字符串与hex互转,二进制字符串与整数互转的工具函数

    本资源是ruby代码,提供了一系列封装好的函数,用于快速进行转换,一个函数搞定,包括如下转换,二进制字符串与hex字符串的互转。二进制字符串与整数互转,包括uint8,uin16,uint32, 以及本地字节序和网络字节序两种...

    Ruby 字符串处理

    Ruby将字符串像数字一样处理.我们用单引号(‘…’)或双引号(…)将它们括起来. ruby&gt; abc  abc ruby&gt; ‘abc’  abc 单引号和双引号在某些情况下有不同的作用.一个由双引号括起来的字符串允许字符由一个前置的斜杠...

    Ruby-性能测试(完整版)

    Ruby性能测试 Ruby性能测试 Ruby性能测试 Ruby性能测试 Ruby性能测试 Ruby性能测试 Ruby性能测试 Ruby性能测试 Ruby性能测试 Ruby性能测试

    Ruby中常用的字符串处理函数使用实例

    1.返回字符串的长度 代码如下: str.length =&gt; integer 2.判断字符串中是否包含另一个串 代码如下: str.include? other_str =&gt; true or false “hello”.include? “lo” #=&gt; true “hello”.include? “ol” #=&gt;...

    ruby-string-showdown:双引号和单引号 Ruby 字符串……哪个会获胜?

    这个存储库包含一个用于 A/B 测试 Ruby 代码性能的测试工具,以及一些比较双引号和单引号字符串性能的测试。如何运行测试先决条件: Ruby(这是基于 Ruby 版本 2.2.0,但其他版本应该可以正常工作。) Bundler( ...

    Ruby中实现把字符串转换为类的2种方法

    最近有个需求,需要根据一个字符串当作一个类来使用,例如: 有一个字符串 “ChinaMag”,根据这个字符串调用 类 ChinaMag下的方法。 解决办法: 1.rails可以使用 constantize方法。 代码如下: pry(main)&gt; ...

    Ruby-Unicode字符串调试帮助

    Unicode字符串调试帮助

    rubyPHP高性能的PHP框架

    rubyPHP的高性能体现在以下几个方面: 1.页面缓存。页面缓存指之前加载过的页面以文件方式缓存在服务器中,在一段时间内再次加载相同页面时无需重新执行页面逻辑直接加载静态页面。rubyPHP的页面缓存是自动进行的,...

    模糊字符串匹配:ruby的模糊字符串匹配库

    Fuzzy-string-match是用于ruby的模糊字符串匹配库。 很快(用RubyInline用C编写) 它仅支持Jaro-Winkler距离算法。 该程序是从Lucene 3.0.2手动移植的。 (lucene是Java产品) 如果要添加其他字符串距离算法,...

    Ruby-GeoPattern从字符串创建漂亮的生成几何背景图像

    GeoPattern - 从字符串创建漂亮的生成几何背景图像

    Ruby字符串、条件、循环、数组、Hash、类基本操作笔记

    一、字符串操作 字符串插值 1.#{}: 任意放置在#{}中的合法Ruby代码都将被求值,并被替换为求值结果插入到原位置 2.单引号与双引号差别: 双引号允许字符转义,单引号不允许转义,里是什么字符,用户看到的就是什么字符...

    Ruby中操作字符串的一些基本方法

    如果需要内放置一个单引号,单引号的字符串文字,在它前面加上一个反斜杠Ruby解释器不认为终止字符串: 'Won\'t you read O\'Reilly\'s book?' 反斜杠也可以转义另一个反斜杠,这样第二个反斜杠本身不是解释为转义...

    提升Ruby on Rails性能的几个解决方案

    Ruby On Rails 框架自它提出之日起就受到广泛关注,在“不要重复自己”,“约定优于配置”等思想的指导下,Rails 带给 Web 开发者的是极高的开发效率。 ActiveRecord 的灵活让你再也不用配置繁琐的 Hibernate 即可...

    unicode-blocks:Ruby 字符串的 Unicode 块

    这个 gem 返回与给定字符串关联的所有块。 Unicode 版本: 13.0.0 (2020 年 3 月) 支持的Ruby:3.0,2.7,2.6,2.5 可能仍然有效的旧Ruby: 2.4 、 2.3 、 2.2 、 2.1 、 2.0 文件 gem "unicode-blocks" 用法...

    JavaScript 字符串乘法

    原文地址:http://www.davidflanagan.com/2009/08/string-multipli.html原作者:David Flanagan在Ruby中,“*”操作符用一个字符串作为左边参数,一个数字作为右边参数,来实现字符串重复。例如,”Ruby” * 2 的值...

    string_foundation.rb:扩展Ruby字符串类的库

    String Foundation是一个Ruby库,为Ruby字符串类提供有用的方法。目录是象征长度法等于少于小于或等于比...更棒大于或等于可转换方法整数浮到TrueClass / FalseClass 用方法删除前导零(零填充) 转换方法到True...

    mojimoji:Ruby的字符串格式化程序

    门司寺 在String中添加很棒的方法来格式化浪费空间和宽度。 安装 将此行添加到您的应用程序的Gemfile中: gem 'mojimoji' 然后执行: $ bundle 或将其自己安装为: $ gem install mojimoji ...

    ruby基础教程(第四版)第14章 字符串类1

    1.将2个字符串合并为新的字符串 2.扩展原有的字符串 1.index方法和rindex方法, index从左往右检查字符串是否存在,找到后返回首个字符串的索引

    Ruby-Falcon用于Ruby的高性能web服务器支持HTTP2和HTTPS

    Falcon:用于Ruby的高性能web服务器,支持HTTP/2和HTTPS

Global site tag (gtag.js) - Google Analytics