【C#】C#性能优化:用StringBuilder与ToString(X2)提升字符串拼接与字节转换效率

一、使用 StringBuilder 代替 += 来优化字符串拼接

从代码的可读性性能维护性三个方面进行分析。以下是详细的分析:

实现 1

uint crc = CRC16(data, Convert.ToUInt32(data.Length));
string ds = "";
foreach (var messageByte in data)
{ds += messageByte.ToString("X2");
}
ds += (Convert.ToString(crc, 16).ToUpper().PadLeft(4, '0').Substring(2, 2) + Convert.ToString(crc, 16).ToUpper().PadLeft(4, '0').Substring(0, 2));
byte[] sendData = null;
sendData = strToHexByte(ds.Trim());
SendData(sendData);

缺点:

  1. 性能问题
    • 使用了字符串拼接 (ds += ...),这会导致每次拼接都会创建新的字符串对象,增加内存分配和垃圾回收的压力。
    • 对于较大的数据量,这种方式的性能会显著下降。

改进方案

一个问题:频繁的字符串拼接。在 C# 中,频繁使用 += 拼接字符串会导致性能问题,因为字符串是不可变的,每次拼接都会创建一个新的字符串对象。

为了提高性能和代码的可读性,可以使用 StringBuilder 来优化字符串拼接。以下是改进后的代码:

uint crc = CRC16(data, Convert.ToUInt32(data.Length));
StringBuilder sb = new StringBuilder();// 将每个字节转换为两位十六进制字符串
foreach (var messageByte in data)
{sb.Append(messageByte.ToString("X2"));
}// 添加 CRC 校验值
string crcStr = crc.ToString("X4");
sb.Append(crcStr.Substring(2, 2)); // 高位
sb.Append(crcStr.Substring(0, 2)); // 低位// 转换为字节数组并发送
byte[] sendData = strToHexByte(sb.ToString());
SendData(sendData);

改进后的优点:

  1. 性能提升

    • 使用 StringBuilder 避免了频繁的字符串拼接操作,显著提高了性能,尤其是在处理大量数据时。
  2. 代码清晰

    • 逻辑更加清晰,易于阅读和维护。
    • 避免了多余的空格处理和重复的 Convert.ToString 调用。
  3. 一致性

    • 所有字节和 CRC 校验值的格式化方式保持一致,减少了潜在的错误。

总结

  • 从性能和可维护性的角度来看,推荐使用改进后的 StringBuilder 实现,这是处理字符串拼接的最佳实践。

最终答案:改进后的 StringBuilder 实现更好

二、Byte.ToString("X2")Convert.ToString(Byte, 16).ToUpper().PadLeft(2, '0')

对于任何字节值(byte 类型),messageByte.ToString("X2")Convert.ToString(data[i], 16).ToUpper().PadLeft(2, '0') 的输出效果是一样的。它们都用于将一个字节(byte 类型)转换为两位的大写十六进制字符串。以下是详细的对比和分析:


1. messageByte.ToString("X2")

  • 作用

    • 将字节值直接格式化为两位大写的十六进制字符串。
    • "X2" 是标准的格式化字符串:
      • "X" 表示十六进制格式。
      • "2" 表示结果至少包含两位字符,不足时用前导零补齐。
  • 示例

    byte b = 15;
    string result = b.ToString("X2"); // 输出: "0F"
    
  • 特点

    • 简洁、直观。
    • 内置支持前导零填充,无需额外操作。

2. Convert.ToString(data[i], 16).ToUpper().PadLeft(2, '0')

  • 作用

    • Convert.ToString(data[i], 16):将字节值转换为小写的十六进制字符串(无前导零)。
    • .ToUpper():将小写字母转换为大写字母。
    • .PadLeft(2, '0'):确保字符串长度为 2,不足时在左侧填充 '0'
  • 示例

    byte b = 15;
    string result = Convert.ToString(b, 16).ToUpper().PadLeft(2, '0'); // 输出: "0F"
    
  • 特点

    • 更冗长,需要多个方法调用。
    • 需要手动处理大小写和前导零。

输出效果对比

对于任何字节值(byte 类型),两种方法的输出结果完全一致。例如:

字节值 ToString("X2") Convert.ToString(...)
0 "00" "00"
15 "0F" "0F"
255 "FF" "FF"

性能对比

虽然两种方法的输出相同,但在性能上存在一些差异:

  1. ToString("X2")

    • 更高效,因为它是专门设计用于格式化的内置方法。
    • 不需要额外的字符串操作(如 ToUpperPadLeft)。
  2. Convert.ToString(...)

    • 性能稍差,因为它涉及多个步骤(转换、大小写调整、填充)。
    • 每个步骤都会增加函数调用的开销。

推荐使用

如果目标是将字节值转换为两位大写的十六进制字符串,推荐使用 ToString("X2"),因为它更简洁、高效且易于阅读。

foreach (var messageByte in data)
{ds += messageByte.ToString("X2");
}

Convert.ToString(...) 的方式更适合在需要更灵活的转换场景下使用(例如,非固定长度的十六进制字符串)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/891114.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何判断大小端?

联合体成员低地址对齐方法一:联合体 #include <stdio.h> #include <malloc.h>union myunion {int a;char b; };int main(void) {union myunion test;test.a = 0x12345678; if (test.b == 0x78)printf("小端模式"); else if (test.b == 0x12)printf(&q…

hexo 本地启动项目 hexo-browsersync 不工作原因总结

问题 1 : hexo-server 开启 compress 压缩后 hexo-browsersync 插件热更新完全无效,没办法自动刷新 此问题表现在 hexo 任何版本 问题原因: hexo-server 依赖 compression^1.7.4 会自动安装 compression@1.8.0,压缩后 Content-Encoding 不是 gzip 而是 br, hexo-browsersy…

共振底选股思路和案例

当前时间: 2025年2月28日 主图中的所有提示都编写了选股指标,我无偿分享。 共振底选股思路: 在短线、中线均都向上的情况下,同时出现以下条件的两个以上,则为共振底。 1. 1025战法的低吸位附近出现止跌阳线。 2. 小底图形反包。 3. 泰乐KDJ副图指标显示【大进】、【逛进】…

Vue2/Vue3 项目生产环境开启 vue devtools 插件线上调试 vue 组件

说到 vue 项目的调试工具,必然少不了 “vue devtools 插件”,此插件就像“手术刀”一样,是开发环境下的一个利器,生产环境一般情况没办法使用。 要在生产环境使用,就必须要一点手段。前置条件安装 Chrome 浏览器,本文编写时使用的 Google Chrome 133 版本。 安装 vue dev…

Windows编程系列:获取系统BIOS信息

在前面的文章中,介绍过WMI的使用 https://www.cnblogs.com/zhaotianff/p/14764740.html在Win32 Provider下面提供了一个Win32_BIOS类,可以获取BIOS信息我们还可以通过SMBIOS标准规范来获取BIOS信息SMBIOS介绍 SMBIOS (System Management BIOS ,系统管理BIOS)是通过系统固件…

【大模型安全】大模型攻击测试案例分析

本节通过对实际案例的研究,直观展示大模型(LLM)攻击测试是如何识别模型中存在的安全隐患。为确保被测大模型系统的安全运行,我们仅执行了无危害的查询操作,目的是发现潜在的安全漏洞和风险点。 案例1: 某互联网厂商LLM存在远程代码执行漏洞(过度代理),攻击者可通过此漏…

谷歌 Chrome 浏览器离线安装 vue devtools 插件

由于某些原因,Chrome 应用商店访问不了,所以只能离线安装 vue devtools 插件,离线安装也有两种方法。 方法一:自编译 vue devtools 插件 这方法要求动手能力强的同学。前往 github 下载 vue devtools 插件源码(https://github.com/vuejs/devtools)。在本地编译源码。编译成…

CRM选型避坑指南:别踩这些常见雷区!

选CRM就像找工作,选错了不仅折腾自己,还浪费时间和钱。 市面上CRM那么多,花里胡哨的功能一堆,价格跨度也大,选起来就像进了迷宫,一不小心就掉坑里。所以今天就聊聊那些常见的选型雷区,教你如何避开这些坑,选到真正适合自己的CRM!这里整理好了最好用CRM系统——简道云 …

医院HIS系统通过互联网调用医保内网(专网)接口

前言其实更准确的主题应该为:如何通过互联网访问专网服务器的http 服务,因为原理是一样的。全国医保刚实行升级时,很多HIS开发人员通过远程医院前置机再跳转医保网进行调试,操作很麻烦,如果能在办公室通过互联网直接访问医保网那就太方便了。全国医保的接口都是通过http方…

No.26 JavaScript--简介

前端3件套:HTML CSS JS 一、JS简介JavaScript 是一种轻量级的脚本语言。所谓“脚本语言”,指的是它不具备开发操作系统的能力,而是只用来编写控制其他大型应用程序的“脚本”。 JavaScript 是一种嵌入式(embedded)语言。它本身提供的核心语法不算很多。1.为什么学JS操控浏…

打造自主高效团队:企业团队协作工具私有化部署指南

企业团队协作工具的私有化部署是指将软件部署在企业自有的服务器上,而非使用公有云或第三方平台。以下是对企业团队协作工具私有化的详细分析: 一、私有化的优势 ● 数据安全可控:企业数据存储在本地服务器,无需上传至第三方平台,有效降低数据泄露风险,满足企业对数据安全…

快收藏!一个技巧从此不再搞混缓存穿透和缓存击穿

在 Redis 中有两个定义:一个缓存击穿、一个缓存穿透,因为二者的名字比较像,因此很容易就搞混了。但本文会给你提供一个记忆的小技巧,帮你彻底区分二者的定义。 在讲这个技巧之前,我们先来了解一下二者的区别。 1.定义与区别缓存穿透(Cache Penetration):缓存穿透是指查…