Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
不是';t现代计算机功能强大,无需使用符号即可处理字符串(Ruby)_Ruby_Performance_String_Symbols - Fatal编程技术网

不是';t现代计算机功能强大,无需使用符号即可处理字符串(Ruby)

不是';t现代计算机功能强大,无需使用符号即可处理字符串(Ruby),ruby,performance,string,symbols,Ruby,Performance,String,Symbols,我读过的每一篇关于Ruby符号的文章都谈到符号相对于字符串的效率。但是,这不是20世纪70年代。我的电脑可以处理一些额外的垃圾收集。我错了吗?我有最新和最好的奔腾双核处理器和4千兆内存。我认为这应该足以处理一些字符串。很好,符号被保证是唯一的——这可以产生一些从字符串中得不到的好效果(例如,我相信它们的地址总是完全相等) 另外,它们有不同的含义,您可能希望在不同的领域使用它们,但ruby对这类东西的要求并不严格,所以我可以理解您的问题。的确,出于内存原因,您不需要太多的令牌。毫无疑问,您的计算机

我读过的每一篇关于Ruby符号的文章都谈到符号相对于字符串的效率。但是,这不是20世纪70年代。我的电脑可以处理一些额外的垃圾收集。我错了吗?我有最新和最好的奔腾双核处理器和4千兆内存。我认为这应该足以处理一些字符串。

很好,符号被保证是唯一的——这可以产生一些从字符串中得不到的好效果(例如,我相信它们的地址总是完全相等)


另外,它们有不同的含义,您可能希望在不同的领域使用它们,但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
制作完成,它就再也不会制作另一个了。每次你提到一个给定的符号,你指的是同一个对象。没有时间或内存浪费在新的分配上。如果你对它们太疯狂了,这也可能是一个缺点——它们从来都不是垃圾收集的,所以如果你开始从用户输入动态创建无数符号,你就有无限内存泄漏的风险。但对于代码中的简单文本,如常量值或散列键,它们几乎完美无瑕


这有用吗?这与你的应用程序做什么无关。这是关于它做了数百万次的事情。

很有趣。我没有想到符号不是垃圾收集的。很酷的文章。谢谢你的链接。这就像,“你想知道的关于符号的一切”:)和平,伙计。是的,这是真的-长时间运行的循环肯定会消耗资源。我没有想过在循环中创建字符串,但是,当然,我想你可能会这么做。谢谢你的提示;当我第一次读到这篇文章时,我对自己说:“哇,这是多么肤浅的理由啊!”。但我越想它,我就越意识到这是我自己使用符号的一大动机。谢谢你帮助我了解我自己。