不是';t现代计算机功能强大,无需使用符号即可处理字符串(Ruby)
我读过的每一篇关于Ruby符号的文章都谈到符号相对于字符串的效率。但是,这不是20世纪70年代。我的电脑可以处理一些额外的垃圾收集。我错了吗?我有最新和最好的奔腾双核处理器和4千兆内存。我认为这应该足以处理一些字符串。很好,符号被保证是唯一的——这可以产生一些从字符串中得不到的好效果(例如,我相信它们的地址总是完全相等)不是';t现代计算机功能强大,无需使用符号即可处理字符串(Ruby),ruby,performance,string,symbols,Ruby,Performance,String,Symbols,我读过的每一篇关于Ruby符号的文章都谈到符号相对于字符串的效率。但是,这不是20世纪70年代。我的电脑可以处理一些额外的垃圾收集。我错了吗?我有最新和最好的奔腾双核处理器和4千兆内存。我认为这应该足以处理一些字符串。很好,符号被保证是唯一的——这可以产生一些从字符串中得不到的好效果(例如,我相信它们的地址总是完全相等) 另外,它们有不同的含义,您可能希望在不同的领域使用它们,但ruby对这类东西的要求并不严格,所以我可以理解您的问题。的确,出于内存原因,您不需要太多的令牌。毫无疑问,您的计算机
另外,它们有不同的含义,您可能希望在不同的领域使用它们,但ruby对这类东西的要求并不严格,所以我可以理解您的问题。的确,出于内存原因,您不需要太多的令牌。毫无疑问,您的计算机可以处理各种粗糙的字符串处理 但是,除了速度更快之外,代币还有一个额外的优势(特别是在上下文着色的情况下):看着我,我是键值对中的一个键。这是我使用它们的充分理由 还有其他原因。。。而且在很多方面的性能提升可能比你意识到的要多,特别是做一些比较之类的事情 当比较两个ruby符号时,解释器只是比较两个对象地址。当比较两个字符串时,解释器必须一次比较每个字符。如果你做了很多这方面的工作,那么这种计算可以累加起来 虽然符号有其自身的性能问题。。。它们从不被垃圾收集 这篇文章值得一读:
您的计算机很可能能够处理“一点点额外的垃圾收集”,但当“一点点”发生在一个运行数百万次的内部循环中时,情况会怎样呢?当它在内存有限的嵌入式系统上运行时会怎么样
在很多地方,你可以随意使用字符串,但在某些地方你不能。这完全取决于上下文。少键入一个字符。这就是我需要在哈希键等字符串上使用它们的所有理由。这是造成差异的真正原因:字符串从来都不一样。字符串的每个实例都是一个单独的对象,即使内容相同。大多数对字符串的操作都会生成新的字符串对象。考虑以下事项:
a = 'zowie'
b = 'zowie'
a == b #=> true
从表面上看,很容易断言a
和b
是相同的。大多数常识操作都会按照您的预期工作。但是:
a.object_id #=> 2152589920 (when I ran this in irb)
b.object_id #=> 2152572980
a.equal?(b) #=> false
它们看起来一样,但它们是不同的物体。Ruby必须分配两次内存,执行两次String#initialize
方法,等等。它们在内存中占据了两个独立的位置。嘿!当您尝试修改它们时,它会变得更加有趣:
a += '' #=> 'zowie'
a.object_id #=> 2151845240
在这里,我们不向a
添加任何内容,并保持内容完全相同——但Ruby不知道这一点。它仍然分配一个全新的String对象,将变量a
重新分配给它,而旧的String对象坐在那里等待最终的垃圾回收。哦,空的'
字符串也会得到一个临时字符串对象,该对象只分配给该行代码的持续时间。试试看:
''.object_id #=> 2152710260
''.object_id #=> 2152694840
''.object_id #=> 2152681980
这些对象分配在您灵活的数千兆赫处理器上快吗?当然是。他们会吃掉你的4GB内存吗?不,他们不会。但是再重复几百万次,它就开始累积了。大多数应用程序到处都使用临时字符串,并且您的代码中可能充满了方法和循环中的字符串文本。每一行代码每次运行时,这些字符串文本都会分配一个新的字符串对象。真正的问题甚至不是内存浪费;当垃圾收集触发得太频繁而应用程序开始挂起时,就会浪费时间
相比之下,请看一下符号:
a = :zowie
b = :zowie
a.object_id #=> 456488
b.object_id #=> 456488
a == b #=> true
a.equal?(b) #=> true
一旦符号:zowie
制作完成,它就再也不会制作另一个了。每次你提到一个给定的符号,你指的是同一个对象。没有时间或内存浪费在新的分配上。如果你对它们太疯狂了,这也可能是一个缺点——它们从来都不是垃圾收集的,所以如果你开始从用户输入动态创建无数符号,你就有无限内存泄漏的风险。但对于代码中的简单文本,如常量值或散列键,它们几乎完美无瑕
这有用吗?这与你的应用程序做什么无关。这是关于它做了数百万次的事情。很有趣。我没有想到符号不是垃圾收集的。很酷的文章。谢谢你的链接。这就像,“你想知道的关于符号的一切”:)和平,伙计。是的,这是真的-长时间运行的循环肯定会消耗资源。我没有想过在循环中创建字符串,但是,当然,我想你可能会这么做。谢谢你的提示;当我第一次读到这篇文章时,我对自己说:“哇,这是多么肤浅的理由啊!”。但我越想它,我就越意识到这是我自己使用符号的一大动机。谢谢你帮助我了解我自己。