VB.NET 中字符串中的字符替换

2024-01-09

替换字符串中的字符的速度有多快?

所以这个问题的背景是这样的:我们有几个应用程序,它们通过套接字相互通信以及与客户端应用程序通信。这些套接字消息包含不可打印的字符(例如 chr(0)),需要用预定的字符串(例如“{Nul}”}替换,因为套接字消息保存在日志文件中。顺便说一句,不是每条日志消息都需要替换字符。

现在我开始了这个小小的冒险阅读这个 MSDN 链接 http://blogs.msdn.com/b/debuggingtoolbox/archive/2008/04/02/comparing-regex-replace-string-replace-and-stringbuilder-replace-which-has-better-performance.aspx?PageIndex=2#comments我从这个网站的另一篇文章中找到了它。

我们当前使用的方法...在当天开始时...正在使用 StringBuilder 来检查所有可能的替换,例如...

    Public Function ReplaceSB(ByVal p_Message As String) As String
      Dim sb As New System.Text.StringBuilder(p_Message)

      sb.Replace(Chr(0), "{NUL}")
      sb.Replace(Chr(1), "{SOH}")

      Return sb.ToString
    End Function

现在,正如博客文章指出的那样,将 StringBuilder 排除在外并使用 string.replace 确实会产生更快的结果。 (实际上,使用 StringBuilder 是整天执行此操作最慢的方法。)

    p_Message = p_Message.Replace(Chr(0), "{NUL}")
    p_Message = p_Message.Replace(Chr(1), "{SOH}")

知道并非每条消息都需要经过此过程,我认为不必处理那些可能被遗漏的消息会节省时间。因此,我首先使用正则表达式搜索字符串,然后确定是否需要处理它。这与使用 string.replace 大致相同,基本上是节省了不处理所有字符串的时间,但因为使用正则表达式检查所有字符串而损失了时间。

然后建议尝试使用一些将其索引与新旧索引相匹配的数组,并使用它来处理消息。所以它会是这样的......

Private chrArray() As Char = {Chr(0), Chr(1)}
Private strArray() As String = {"{NUL}", "{SOH}"}

Public Function TestReplace(ByVal p_Message As String) As String
    Dim i As Integer

    For i = 0 To ((chrArray.Length) - 1)
        If p_Message.Contains(chrArray(i).ToString) Then
            p_Message = p_Message.Replace(chrArray(i), strArray(i))
        End If
    Next

    Return p_Message
End Function

到目前为止,这是我发现处理这些消息的最快方法。我尝试了各种其他方法来解决此问题,例如将传入的字符串转换为字符数组并进行比较,并尝试循环遍历字符串而不是 chrArray。

所以我对所有人的问题是:我可以让这个更快吗?我缺少什么?


您也许可以通过减少一些查找来提高速度。以此为例:

    If p_Message.Contains(chrArray(i).ToString) Then

The .Contains方法是 O(n)。在最坏的情况下,您将遍历整个字符串中的所有字符而找不到任何内容,因此您希望对数组中的每个字符至少遍历一次,因此其时间复杂度为 O(nm),其中 n 是你的字符串,m是你要替换的字符数。

执行以下操作可能会获得更好的性能(我的 VB-fu 生锈了,尚未经过测试;)):

Private Function WriteToCharList(s as String, dest as List(Of Char))
    for each c as Char in s
        dest.Add(c)
    Next
End Function

Public Function TestReplace(ByVal p_Message As String) As String
    Dim chars as new List(Of Char)(p_Message.Length)

    For each c as Char in p_Message
        Select Case c
            Case Chr(0): WriteToCharList("{NUL}", chars)
            Case Chr(1): WriteToCharList("{SOH}", chars)
            Case Else: chars.Add(c);
        End Select
    Next

    Return New String(chars)
End Function

这将遍历中的字符p_Message最多两次(一次用于遍历,一次当字符串构造函数复制 char 数组时),使得该函数的复杂度为 O(n)。

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

VB.NET 中字符串中的字符替换 的相关文章

  • 使用信用卡号的字符串格式

    我正在尝试将信用卡号显示为类似 的字符串 I tried txtbox Text string Format 0 ccNumber 但它不起作用 有任何想法吗 String Format 0 0000 0000 0000 0000 numb
  • 类型错误:“datetime.datetime”和“str”的实例之间不支持“>”

    我是 python 日期和时间类型的新手 我有一个日期值 date 2018 11 10 10 55 31 00 00 我需要检查该日期值是否超过 90 天 我试过 from datetime import datetime from da
  • unordered_map 中字符串的 C++ 哈希函数

    看起来 C 标准库中没有字符串的哈希函数 这是真的 在任何 c 编译器上使用字符串作为 unordered map 中的键的工作示例是什么 C STL提供模板专业化 http en cppreference com w cpp string
  • T-SQL:如何获取字符串的确切字符长度?

    我正在为预先没有数据类型信息的表生成 T SQL SELECT 语句 在这些语句中 我需要执行取决于表列的原始值的长度的字符串操作操作 一个示例 但不是唯一的示例 是在字符串中的特定位置插入一些文本 包括将其插入末尾的选项 SELECT C
  • 如何展平解析树并存储在字符串中以进行进一步的字符串操作 python nltk

    我正在尝试从树结构中获取扁平树 如下所示 我想将整个树放在一个字符串中 就像没有检测到坏树错误一样 S NP SBJ NP DT The JJ high JJ seven day PP IN of NP DT the CD 400 NNS
  • 如何检测字符串中的非 ASCII 字符?

    如果我有一个 PHP 字符串 如何以有效的方式确定它是否至少包含一个非 ASCII 字符 我所说的非 ASCII 字符是指不属于该表的任何字符 http www asciitable com http www asciitable com
  • VB.NET 中的 TextChanged 事件

    我有两个基本文本框 比方说 A 和 B 我希望在一个文本框中输入内容以清除另一个文本框中的任何输入 例如 在 A 中键入 123 现在在 B 中键入 456 B 应包含 456 A 应为空 但是 我在 B 中收到 56 而 A 为空 似乎
  • 对话框上的 EditText 不返回任何文本

    我太累了 找不到错误 我没有发现任何错误 但我没有从 editText 收到任何文本 请看下面的代码 活动密码 xml
  • 将名称字符串编码为唯一的数字

    我有一大堆名字 数以百万计 他们每个人都有一个名字 一个可选的中间名和一个姓氏 我需要将这些名称编码为唯一代表这些名称的数字 编码应该是一对一的 即一个名称只能与一个数字相关联 一个数字只能与一个名称相关联 对此进行编码的明智方法是什么 我
  • 使用 JSON.net 反序列化

    我对 json JSON net 等都很陌生 在这里阅读类似的问题后 我无法让我的代码工作 我的错误到底是什么 我监督了什么 出于测试目的是否可以跳过 链接 和 元 类 或者我是否必须定义每个属性 我得到以下 REST 输出 codes h
  • 使用 Python 在 Django 中将 Unix 时间戳转换为人类格式

    我想将字符串中的 unix 时间戳 例如 1277722499 82 转换为更人性化的格式 hh mm ss 或类似格式 有没有一种简单的方法可以在 python 中为 django 应用程序执行此操作 这是在模板之外 在我想要执行此操作的
  • C# 中将字符串 (yyyyMMddhhmm) 转换为 DateTime 的函数

    在我的数据库中 我有一个日期类型的字段varchar其中日期以以下格式存储yyyyMMddhhmm 没有空格或其他字符分隔它们 现在我需要将此日期与 C 进行比较DateTime 因此我需要将字符串转换为DateTime 我能想到的最合乎逻
  • 替换C#字符串中的数字

    我正在尝试使用正则表达式对字符串进行一些工作 但遇到了一些困难 我的目标是用字符替换字符串中的数字 特别是如果字符串中有一组数字 我想用一个字符替换整个数字组 如果只有一个数字 我想将其替换为 例如 如果我有字符串 test12345 tx
  • 保留完整姓氏,在 pandas 列中获取名字的首字母(如果有的话,还有中间名)

    我有一个 pandas 数据框 其中有一列表示几位网球运动员的姓氏和姓名 如下所示 Player 0 Roddick Andy 1 Federer Roger 2 Tsonga Jo Wilfred 我想保留完整的姓氏并获取姓名的首字母和中
  • xmlns 元素的顺序重要吗

    我不知道如何在 google 中搜索此内容 但是 xmlns 元素的问题在 XML 文件中重要吗 我正在 ASP NET VB 中使用 XMLWriter 创建一个 XML 文件 并且尝试匹配我提供的示例
  • Ruby 自定义字符串排序

    输入字符串 1654AaBcDddeeFF 输出字符串 1456acddeeABDFF 我尝试过的代码 test array 1654AaBcDddeeFF each byte do char test array lt lt char e
  • 按正确的顺序在字符串数组中查找常见字符

    我花了几天时间研究一个函数 以正确的顺序获取字符串数组中的常见字符 以创建通配符 这是一个解释我的问题的例子 我做了大约3个函数 但是当每个字母的绝对位置不同时 我总是遇到一个错误 我们假设 是 通配符 Array 0 gt 48ca135
  • 错误“无法将‘动态’类型的值分配给‘字符串’类型的变量。”在 Dart 2.2 中

    自上次 dart 更新 2 2 我收到这个错误 dynamic 类型的值不能分配给 dynamic 类型的变量 细绳 这对我来说没有多大意义 代码非常简单 class EmployeeMirror EmployeeMirror this i
  • 正则表达式在 R 中同时多次包含字母/特殊字符时删除单词

    我想删除那些单词中字母 特殊字符的数量同时出现两次以上的单词 例如 输入就像 Google in theee lland of whhhat c c and e 输出应该是 Google in lland of c c and x lt G
  • strlen() 编译时优化

    前几天我发现你可以找到编译时strlen使用这样的东西 template

随机推荐

  • 如何使用直骨架计算多边形的斜接偏移

    我有一个用 Python 实现的 Straight Skeleton 算法 想用它来偏移多边形的边缘 我看过几篇提出这种抵消方法的论文 遗憾的是它们都没有提供有关如何实现它的具体信息 他们之中 带孔简单二维多边形直骨架的 CGAL 实现 h
  • 如何计算给定数据结构中列的平均值?

    我有以下数据结构ds AD TYPE B TYPE D array 84 0 85 0 115 0 dtype object array 31 0 23 0 599 0 dtype object array 75 0 21 0 nan dt
  • 高度为 1fr 的单行网格未填充 Chrome 中的高度

    我在 Flexbox 列内有一个 CSS 网格 并且该网格具有flex grow 1 在 Chrome 中 网格会扩展以填充可用空间 但其内容不会扩展 即使使用align content stretch在网格上 在 Firefox 和 Ed
  • DrawToBitmap - System.ArgumentException:参数无效

    我正在创建一个Label有时我使用 DrawToBitmap 我不知道为什么 但是在我运行我的程序一段时间后 并调用 DrawToBitmap 经常 我得到例外 System ArgumentException Parameter is n
  • nginx:[emerg]此处不允许“服务器”指令

    我已经重新配置了 nginx 但无法使用以下配置重新启动它 server listen 80 server name www example com return 301 scheme example com request uri ser
  • Laravel 连接数据库时超时

    我正在将应用程序从我的开发计算机移动到测试服务器 当连接到我的本地开发 mysql 数据库时 一切都按预期进行 当尝试连接到我们的测试服务器时 请求在 45 秒后超时并返回 500 错误 我测试了服务器可以通信 并且php可以使用基本的my
  • 通过 API 确定是否为用户启用 Google 2 因素身份验证

    我想开发一个使用 Google 作为身份验证提供程序的应用程序 但我希望我的应用程序在帐户注册到我的应用程序之前知道 Google 帐户是否正在使用两步验证 在 Google 开发文档中找不到所需的 API This answer http
  • layoutAttributesForSupplementaryViewOfKind:atIndexPath: 传入不正确的indexPath

    我有一个习惯UICollectionViewLayout它使用补充视图将页脚放置在每个页面的底部 这似乎一直运作良好 直到我开始在页面底部插入单元格 由于补充视图必须链接到 UICollectionView 中的 NSIndexPath 因
  • ASP.NET:Response.Redirect(...) 之后代码会发生什么?

    Response Redirect 是否会导致当前正在运行的方法中止 或者 Response Redirect 之后的代码也执行吗 也就是说 在Response Redirect之后是否需要返回 退出Sub Response Redirec
  • 如何通过 Qt 5.6 将 QML 应用程序窗口设置为透明?

    我是 Qt 和 QML 的新手 现在我设置了一个窗口并希望将其设置为透明 用户可以在我的应用程序中看到我的桌面 我尝试使用WA TranslucentBackground and opacity 但是它不起作用 这是我的 QML 代码 非常
  • 如何在swift中将字节数组转换为base64字符串?

    这是我在 Objective C 中的示例代码 NSString getImageString unsigned char charValue unsigned long sizeOfBytes uint8 t commandbyte ui
  • scipy:插值轨迹

    我有一个由一系列序列形成的轨迹 x y 对 我想使用样条曲线在该轨迹上插入点 我该怎么做呢 使用scipy interpolate UnivariateSpline不起作用 因为两者都没有x nor y是单调的 我可以引入参数化 例如长度d
  • 将数据从一页发送到另一页

    我正在尝试使用 C ASP Net 将表单数据从一个页面发送到另一个页面 我有两个页面default aspx和default2 aspx 这是我在default aspx中的代码
  • Spring 通过自定义身份验证提供程序记住我

    我想为我的应用程序实现记住我服务 我面临的主要问题是我正在使用自定义身份验证提供程序 它使用第三方应用程序进行身份验证 我无法直接访问他们的数据库 我检查了这个Link https stackoverflow com questions 7
  • FFMPEG + Android 包装器使用 FFMPEG 的最新版本

    我正在尝试编译 FFMPEG 以与我的 Android 应用程序一起使用 我看过 https github com halfninja android ffmpeg x264 https github com halfninja andro
  • 如何使机械化不会因该页面上的表单而失败?

    import mechanize url http steamcommunity com br mechanize Browser factory mechanize RobustFactory br open url print br r
  • Worklight - 打开本机应用程序

    在 Worklight 中 可以从 Android 版 Worklight 应用程序打开本机页面 是否可以从 Android 设备中的 Worklight 开发的应用程序启动本机应用程序 如果可以的话 怎样做 提前致谢 对的 这是可能的 以
  • 基于tensorflow的流指标的自定义指标返回NaN

    我正在尝试将 F1 分数定义为 TensorFlow 中的自定义指标DNNClassifier 为此 我编写了一个函数 def metric fn predictions labels weights P tf contrib metric
  • 合并 HAProxy 统计数据?

    我有两个 HAProxy 实例 两个实例都启用了统计数据并且工作正常 我正在尝试将两个实例的统计信息合并为一个 以便我可以使用单个 HAProxy 来查看前端 后端统计信息 我尝试在两个 haproxy 实例的同一端口上设置统计侦听器 但这
  • VB.NET 中字符串中的字符替换

    替换字符串中的字符的速度有多快 所以这个问题的背景是这样的 我们有几个应用程序 它们通过套接字相互通信以及与客户端应用程序通信 这些套接字消息包含不可打印的字符 例如 chr 0 需要用预定的字符串 例如 Nul 替换 因为套接字消息保存在