string.Replace(string, string) 是否创建额外的字符串?

2023-12-29

我们需要将包含日期的字符串转换为dd/mm/yyyy格式化为ddmmyyyy格式(如果您想知道为什么我将日期存储在字符串中,我的软件会处理批量交易文件,这是银行使用的基于行的文本文件格式)。

我目前正在这样做:

string oldFormat = "01/01/2014";
string newFormat = oldFormat.Replace("/", "");

果然,这转换"01/01/2014" to "01012014"。但我的问题是,替换是在一步中发生的,还是创建一个中间字符串(例如:"0101/2014" or "01/012014")?


这就是我问这个的原因:

我正在处理大小从几千字节到数百兆字节的交易文件。到目前为止,我还没有遇到性能/内存问题,因为我仍在使用非常小的文件进行测试。但是当涉及到兆字节时,我不确定这些附加字符串是否会遇到问题。我怀疑情况会是这样,因为strings 是不可变的 https://stackoverflow.com/q/2365272/1461424。对于数百万条记录,这种额外的内存消耗将显着增加。

我已经在使用了StringBuilder http://msdn.microsoft.com/en-us/library/system.text.stringbuilder(v=vs.100).aspxs 用于创建输出文件。而且我也知道丢弃的字符串将被垃圾收集 https://stackoverflow.com/a/2423137/1461424(在时间结束之前的某个时刻)。我想知道是否有一种更好、更有效的方法来替换字符串中所有出现的特定字符/子字符串,而不会另外创建字符串。


果然,这会将“01/01/2014”转换为“01012014”。但我的问题 是,替换是一步发生的,还是创建一个 中间字符串(例如:“0101/2014”或“01/012014”)?

No,它不会为每次替换创建中间字符串。但它确实创建了新的字符串,因为正如您所知,字符串是不可变的。

Why?

没有理由在每次替换时创建新字符串 - 避免它非常简单,并且它将带来巨大的性能提升。

如果你是很感兴趣, 参考source.microsoft.com http://referencesource.microsoft.com and SSCLI2.0 http://www.microsoft.com/en-gb/download/details.aspx?id=4917源代码将演示这一点(如何查看标记为 methodimploptions-internalcall 的方法代码 https://stackoverflow.com/questions/16579078/how-to-see-code-of-method-which-marked-as-methodimploptions-internalcall):

FCIMPL3(Object*, COMString::ReplaceString, StringObject* thisRefUNSAFE, 
          StringObject* oldValueUNSAFE, StringObject* newValueUNSAFE)
{

   // unnecessary code ommited
      while (((index=COMStringBuffer::LocalIndexOfString(thisBuffer,oldBuffer,
             thisLength,oldLength,index))>-1) && (index<=endIndex-oldLength))
    {
        replaceIndex[replaceCount++] = index;
        index+=oldLength;
    }

    if (replaceCount != 0)
    {
        //Calculate the new length of the string and ensure that we have 
        // sufficent room.
        INT64 retValBuffLength = thisLength - 
            ((oldLength - newLength) * (INT64)replaceCount);

        gc.retValString = COMString::NewString((INT32)retValBuffLength);
     // unnecessary code ommited
    }
}

如你看到的,retValBuffLength计算出来,就知道了数量replaceCount's. The 真正的实施对于 .NET 4.0 可能有点不同(SSCLI 4.0 尚未发布),但我向你保证它不会做任何愚蠢的事情:-)。

我想知道是否有更好、更有效的替代方法 字符串中特定字符/子字符串的所有出现,即 不会另外创建字符串。

是的。可重复使用的StringBuilder容量约为 2000 个字符。避免任何内存分配。仅当替换长度相等时,这才是正确的,并且如果处于紧密循环中,则可以获得不错的性能增益。

在编写任何内容之前,请使用大文件运行基准测试,看看性能是否足以满足您的需求。如果性能足够 - 则无需执行任何操作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

string.Replace(string, string) 是否创建额外的字符串? 的相关文章

随机推荐

  • 标签(或“标记”)接口是否已过时?

    我正在尝试帮助一位同事接受 OO 并且我发现在某些情况下 很难找到标签概念的可靠的现实示例 或marker 界面 不包含任何方法的接口 它仅用作标记或标记或标签 虽然对于我们的讨论来说这确实不重要 但我们使用 PHP 作为讨论背后的平台 因
  • ServiceStack支持二进制响应吗?

    ServiceStack服务中是否有任何机制可以返回流 大型二进制数据 WCF 的 MTOM 支持虽然笨拙 但可以有效地返回大量数据 而无需文本转换开销 我喜欢服务堆栈 这个小代码足以从内存流返回 Excel 报告 public class
  • Rails 中 Gemfile 有什么用?

    有什么用Gemfile在铁轨上 如何使用Gemfile 在 Rails 开发过程中 有时您会想要提供一些您需要的功能 但要么您不知道如何做 要么您不想自己实现它 因为有很多才华横溢的开发人员已为其开发投入了工作 您可能需要的这些开发 用户身
  • Django/Python 更新字段值(在模型保存期间)

    我试图在保存 django 模型时将它们中的许多字段大写 看着这个问题 https stackoverflow com questions 825955 changing case upper lower on adding data th
  • Gitlab 从特定源分支合并

    我在 gitlab 有一个分支叫devops我想合并我的master分支与devops分支 但是 我不希望任何其他分支发出合并请求devops分支 是否可以 基本上 对于devops作为合并时的目标分支 仅master可以是源分支 是否可以
  • 我们如何将“.db”推送到模拟器中?

    我们可以推送由某些 ide 创建的数据库吗sqlite工作室并将其推入我们的模拟器中app uses 有什么方法可以将你的 db 格式推送到android模拟器中吗 我认为您想通过在外部创建数据库来发送应用程序 这些是将数据库添加到应用程序
  • OpenShift Jenkins 设备上的 NPM 安装

    我 和其他许多人一样 正在努力让 Openshift 上的 Jenkins 墨盒与 NPM 很好地配合 按照其他人对 SO 的建议 我已成功导航需要在 Openshift 上进行的 NPM 缓存重定向 如下所述here https stac
  • 令人惊叹的 CSS 动画

    我有一个 CSS 动画 我想以 200 毫秒的间隔应用它 我已经这样设置 CSS discrete position relative opacity 1 webkit transition all 5s linear moz transi
  • 为什么允许入口点是私有的? [复制]

    这个问题在这里已经有答案了 这实际上是如何运作的 我想Main应该被 称为 但如果它被标记为私有 这怎么可能呢 public class Program private static void Main 来自 bytes com 上的 Jo
  • 如何从另一个工作流程启动一个工作流程并检索被调用工作流程的返回值

    我正在测试谷歌工作流程 并想从另一个工作流程调用工作流程 但作为一个单独的流程 不是子工作流程 我可以开始执行 但目前无法检索返回值 我收到了一个执行实例 argument null name projects xxxxxxxxxxxx l
  • 为什么 Mono 上的 NetMQ DealerSocket 在 Debian Wheezy 上不向服务器发送消息,但在 Windows 上却发送消息?

    我在 Debian Wheezy 上的 Mono 4 8 上使用 NetMQ 4 0 0 1 时遇到一些问题 经销商套接字不会发送任何消息 直到我不会停止调用它来发送新消息 当我将Thread Sleep 1000 在创建任务之间比一切都好
  • 制作文件警告,覆盖目标命令

    作为 makefile 的一部分 我想生成目标的调试或发布版本 从功能上来说 一切正常但是 我在运行 make 时收到警告 12 SRC shell echo src cpp 13 SRC shell echo TEST ROOT cpp
  • 安装 npm cypress-mongodb 时出现问题

    我正在尝试设置插件cypress mongodb在我们的 cypress 框架上使用 但我遇到了太多问题 我已经安装并配置了插件文档 https www npmjs com package cypress mongodb 但是当我启动 cy
  • 无法删除或更新父行:外键约束失败(hibernate xml 映射)

    我想删除用户所属的所有组 但目前不起作用 我认为在映射 User hbm xml 或 Group hbm xml 级别缺少一些东西 但我不知道 错误是 无法删除或更新父行 外键约束失败 sharedmap groupe 约束FK gq7wi
  • extern"C" 与 extern 的区别

    我是否使用有什么区别extern C 整个标头的说明符 或指定extern对于每个功能 据我所知 没有 因为只有函数和变量可以外部链接 所以当我使用extern每个函数原型和外部变量之前都有说明符 我不需要使用全局extern C 宣言 示
  • 挂钩 Drupal 注册并根据业务逻辑验证用户信息

    我想挂接到注册模块 我已经拥有一个包含 50000 个使用我的旧网站的用户的数据库 现在我正在迁移到 Drupal 我还没有将条目迁移到 drupal 数据库 我将检查我的旧数据库 当用户尝试在 Drupal 中注册时 我需要检查他提供的用
  • 如何在 CALayer.contents 中添加 Stretchable UIImage?

    我有一个 CALayer 我想向其中添加一个可拉伸的图像 如果我只是这样做 layer contents id UIImage imageNamed grayTrim png resizableImageWithCapInsets UIEd
  • 自定义 MVVM 实现对比棱镜

    这个问题的灵感来自这个封闭的问题 Prism 实际上为开发者提供了什么 值得吗 https stackoverflow com questions 6242156 what does prism actually offer the dev
  • 如何在Eclipse上使用Papyrus生成代码?

    我将 Papyrus 安装在here http www eclipse org modeling mdt papyrus updates index php 那么如何使用Papyrus生成代码呢 要从 UML 生成 java 代码 您可以按
  • string.Replace(string, string) 是否创建额外的字符串?

    我们需要将包含日期的字符串转换为dd mm yyyy格式化为ddmmyyyy格式 如果您想知道为什么我将日期存储在字符串中 我的软件会处理批量交易文件 这是银行使用的基于行的文本文件格式 我目前正在这样做 string oldFormat