Performance Rust的String::from(“literal”)是否复制了所有字符串数据?

Performance Rust的String::from(“literal”)是否复制了所有字符串数据?,performance,rust,Performance,Rust,我注意到我经常需要在Rust中执行String::frommydummystring。对from的调用是否最终创建字符串数据的完整副本?这似乎是一个主要的性能问题。是的,From for String通过创建一个新的堆分配缓冲区并将数据从原始片复制到其中来工作 这似乎是一个主要的性能问题 可能比你想象的要少。复制字节块通常非常快。您应该对代码进行基准测试,以了解复制是否是一个瓶颈。即使在复制速度很慢的情况下,大多数非平凡的程序也可能会复制一些字符串;你不能永远不复制任何东西 尽管如此,如果存在大

我注意到我经常需要在Rust中执行String::frommydummystring。对from的调用是否最终创建字符串数据的完整副本?这似乎是一个主要的性能问题。

是的,From for String通过创建一个新的堆分配缓冲区并将数据从原始片复制到其中来工作

这似乎是一个主要的性能问题

可能比你想象的要少。复制字节块通常非常快。您应该对代码进行基准测试,以了解复制是否是一个瓶颈。即使在复制速度很慢的情况下,大多数非平凡的程序也可能会复制一些字符串;你不能永远不复制任何东西

尽管如此,如果存在大量不必要的复制,并且这对您的设计是一个问题,Rust提供了许多其他选项。字符串不是Rust唯一的字符串类型,甚至不是最常用的字符串类型;如果您不需要复制字符串,通常可以使用&str借用它们,使用共享所有权,将拥有决定推迟到运行时使用,甚至使用字符串内部库,例如。值的所有权和复制受Rust的控制,事实上,比大多数其他语言更受控制。最终,由您选择什么样的所有权对程序中的字符串最有意义

工具书类 TRPL第8.2章 是的,From for String通过创建一个新的堆分配缓冲区并将数据从原始片复制到其中来工作

这似乎是一个主要的性能问题

可能比你想象的要少。复制字节块通常非常快。您应该对代码进行基准测试,以了解复制是否是一个瓶颈。即使在复制速度很慢的情况下,大多数非平凡的程序也可能会复制一些字符串;你不能永远不复制任何东西

尽管如此,如果存在大量不必要的复制,并且这对您的设计是一个问题,Rust提供了许多其他选项。字符串不是Rust唯一的字符串类型,甚至不是最常用的字符串类型;如果您不需要复制字符串,通常可以使用&str借用它们,使用共享所有权,将拥有决定推迟到运行时使用,甚至使用字符串内部库,例如。值的所有权和复制受Rust的控制,事实上,比大多数其他语言更受控制。最终,由您选择什么样的所有权对程序中的字符串最有意义

工具书类 TRPL第8.2章
是的,确实如此,但如果不需要对其进行变异,则不需要使用自有字符串。如果您确实需要对其进行变异,则必须将其从.data段中复制出来,因为操作系统会将其标记为只读。需要记住的是,当您复制时,锈迹会让您非常清楚。换句话说,与什么相比,会是一个主要的性能问题?例如,C++中的ValueFooCistSt::fooasd将完全隐式地分配和复制字符串。直到最近,C++才有了一种标准的方式来谈论非拥有的字符串。一种合理的方式是慷慨的。真正昂贵的操作是堆应用程序。这是我们经常做的最昂贵的事情之一。副本虽然看起来是多余的,但相比之下成本较低,数量级上要快几个数量级。是的,确实如此,但如果不需要对其进行变异,则不需要使用自有字符串。如果您确实需要对其进行变异,则必须将其从.data段中复制出来,因为操作系统会将其标记为只读。需要记住的是,当您复制时,锈迹会让您非常清楚。换句话说,与什么相比,会是一个主要的性能问题?例如,C++中的ValueFooCistSt::fooasd将完全隐式地分配和复制字符串。直到最近,C++才有了一种标准的方式来谈论非拥有的字符串。一种合理的方式是慷慨的。真正昂贵的操作是堆应用程序。这是我们经常做的最昂贵的事情之一。相比之下,这种复制品可能显得多余,但价格便宜,速度快了几个数量级。