当前位置: 首页 > news >正文

.NET9 实现字符串拼接(StringConcatenation)性能测试

为了评估 .NET9 平台上使用 C# 中不同字符串拼接操作的性能表现,我们可以使用 BenchmarkDotNet 这一强大的开源库来构建科学且可重复的基准测试。

  • BenchmarkDotNet 能够自动处理诸如 JIT 编译、预热(Warm-up)、运行次数控制、统计误差分析等底层细节,确保测试结果具有高度准确性与可比性。

.NET9 中,使用 C# 字符串拼接的常见方式包括:

  1. 使用 + 运算符
  2. 使用 string.Concat
  3. 使用 string.Format
  4. 使用插值字符串 $"{variable}"
  5. 使用 StringBuilder

为了满足大家对性能的需求,我会创建两个类:

  • StringConcatenationOperations.cs:包含各种字符串拼接操作的实现。
  • StringConcatenationBenchmark.cs:使用 BenchmarkDotNet 对这些操作进行基准测试。

以下是具体的代码实现。


项目准备

  • 项目信息
<Project Sdk="Microsoft.NET.Sdk"><PropertyGroup><OutputType>Exe</OutputType><TargetFramework>net9.0</TargetFramework><ImplicitUsings>enable</ImplicitUsings><Nullable>enable</Nullable><PublishAot>true</PublishAot><InvariantGlobalization>true</InvariantGlobalization></PropertyGroup><ItemGroup><PackageReference Include="Datadog.Trace.BenchmarkDotNet" Version="2.61.0" /></ItemGroup></Project>
  • StringConcatenationOperations
// ====================================================
// 字符串拼接实现:在 .NET 中,字符串拼接的常见方式
// ====================================================using System.Text;namespace BenchmarkTest.examples.StringConcatenation;internal static class StringConcatenationOperations
{// 使用 + 运算符public static string UsePlusOperator(string a, string b, string c){return a + b + c;}// 使用 string.Concatpublic static string UseStringConcat(string a, string b, string c){return string.Concat(a, b, c);}// 使用 string.Formatpublic static string UseStringFormat(string a, string b, string c){return string.Format("{0}{1}{2}", a, b, c);}// 使用插值字符串 $"{variable}"public static string UseStringInterpolation(string a, string b, string c){return $"{a}{b}{c}";}// 使用 StringBuilderpublic static string UseStringBuilder(string a, string b, string c){var sb = new StringBuilder();sb.Append(a);sb.Append(b);sb.Append(c);return sb.ToString();}
}
  • StringConcatenationBenchmark
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Configs;
using BenchmarkDotNet.Running;
using Datadog.Trace.BenchmarkDotNet;namespace BenchmarkTest.examples.StringConcatenation;[DatadogDiagnoser]
[MemoryDiagnoser]
public class StringConcatenationBenchmark
{private const string A = "Hello";private const string B = " ";private const string C = "World";[Benchmark]public string PlusOperator(){return StringConcatenationOperations.UsePlusOperator(A, B, C);}[Benchmark]public string StringConcat(){return StringConcatenationOperations.UseStringConcat(A, B, C);}[Benchmark]public string StringFormat(){return StringConcatenationOperations.UseStringFormat(A, B, C);}[Benchmark]public string StringInterpolation(){return StringConcatenationOperations.UseStringInterpolation(A, B, C);}[Benchmark]public string StringBuilder(){return StringConcatenationOperations.UseStringBuilder(A, B, C);}public static void Run(IConfig config){var summary = BenchmarkRunner.Run<StringConcatenationBenchmark>(config);Console.WriteLine(summary);}
}
  • Program.cs 中运行基准测试
using BenchmarkDotNet.Configs;
using Datadog.Trace.BenchmarkDotNet;
using BenchmarkTest.examples.StringConcatenation;Console.WriteLine("Hello, BenchmarkDotNetTest!");var config = DefaultConfig.Instance.WithDatadog();
StringConcatenationBenchmark.Run(config);
  • 运行测试

在项目根目录,使用 pwsh 终端输入命令:

dotnet run -c Release

输出信息:

StringConcatenationBenchmark

以下是对 BenchmarkDotNet 测试结果的详细分析:


🧪 测试环境信息

  • BenchmarkDotNet 版本: v0.13.2
  • 操作系统: Windows 11 (10.0.26100.4484)
  • .NET SDK: 9.0.301
  • 运行时: .NET 9.0.6 (9.0.625.26613), X64 AOT AVX2
  • JIT 编译器: RyuJIT AVX2

📊 基准测试结果

方法名平均耗时(Mean)误差范围(Error)标准差(StdDev)GC Gen0 次数内存分配
PlusOperator21.01 ns0.233 ns0.207 ns0.030648 B
StringConcat21.06 ns0.493 ns0.606 ns0.030648 B
StringFormat78.65 ns1.389 ns1.300 ns0.030548 B
StringInterpolation20.88 ns0.460 ns0.529 ns0.030648 B
StringBuilder35.37 ns0.769 ns1.175 ns0.0969152 B

🔍 逐项分析

1. + 运算符拼接 (PlusOperator)
  • 平均耗时: 21.01 ns
  • 内存分配: 48 字节
  • 特点:
    • 简洁直观,适合少量字符串拼接。
    • 在编译时会自动优化为 string.Concat
  • 结论: 性能优秀,适合简单拼接场景。
2. string.Concat (StringConcat)
  • 平均耗时: 21.06 ns
  • 内存分配: 48 字节
  • 特点:
    • 直接调用底层方法,性能与 + 相当。
    • 更加显式地表达意图,适合对性能敏感或需要明确控制拼接逻辑的代码。
  • 结论: 和 + 类似,但更推荐用于多参数拼接。
3. string.Format (StringFormat)
  • 平均耗时: 78.65 ns
  • 内存分配: 48 字节
  • 特点:
    • 支持格式化字符串,适合需要插入变量和格式控制的场景。
    • 由于涉及解析格式字符串,性能较差。
  • 结论: 如果需要格式化,可以使用;否则建议避免。
4. 插值字符串 (StringInterpolation)
  • 平均耗时: 20.88 ns
  • 内存分配: 48 字节
  • 特点:
    • C# 6 引入的新特性,语法简洁、可读性高。
    • 实际上会被编译为 string.Format 或直接内联为 string.Concat
  • 结论: 性能优异,同时具备良好的可读性,推荐使用。
5. StringBuilder (StringBuilder)
  • 平均耗时: 35.37 ns
  • 内存分配: 152 字节
  • 特点:
    • 适用于频繁修改或大量拼接的场景(如循环中拼接字符串)。
    • 初始化和操作有一定开销,不适合一次性小规模拼接。
  • 结论: 多次拼接时优势明显,单次拼接不推荐。

⚠️ 警告信息

  • MultimodalDistribution(多峰分布)
    • StringBuilder 方法的执行时间分布呈现双峰(bimodal),说明其性能波动较大。
    • 可能原因:GC 影响、缓存命中率变化或其他外部因素。

⚠️ 提示信息

  • Outliers(异常值)
    • PlusOperatorStringFormatStringInterpolation 都检测到了一些性能异常值。
    • 通常由系统负载、GC 操作或其他临时干扰引起。
    • 建议多次运行以确保数据稳定性。

📌 总结建议

使用场景推荐方式原因
简单拼接+string.Concat性能最佳,语法简洁
需要格式化输出string.Format功能强大,但性能略差
提高可读性和现代写法插值字符串 $"{a}{b}"性能接近最优,语法清晰
循环拼接或大量拼接StringBuilder减少内存分配,避免频繁创建新字符串
高频调用的小规模拼接避免使用 StringBuilder初始开销大,小规模拼接时不划算

如果你希望进一步优化测试,比如增加样本数量、调整测试参数,或者测试不同长度的字符串拼接,我可以帮助你修改基准测试代码。欢迎继续提问!

http://www.lryc.cn/news/581482.html

相关文章:

  • 深入探索 pnpm:高效磁盘利用与灵活的包管理解决方案
  • jmm,`as - if - serial` 与 `happens - before` 原则
  • 【一起来学AI大模型】算法核心:数组/哈希表/树/排序/动态规划(LeetCode精练)
  • OpenSearch 向量搜索与Qwen3-Embedding 集成示例
  • @Data、@AllArgsConstructor、@NoArgsConstructor不生效。lombok不起作用怎么解决?
  • Web前端开发-Vue
  • 多人协同开发时Git使用命令
  • 锁和事务的关系
  • 深入探索开源爬虫MediaCrawler,从入门到掌握多平台数据收集
  • HarmonyOS学习6 --- 数据存储
  • 9. 【Vue实战--孢子记账--Web 版开发】-- 账户账本管理(二)
  • MySQL CDC与Kafka整合指南:构建实时数据管道的完整方案
  • 1.线性神经网络--线性回归
  • 华为云 银河麒麟 vscode远程连接
  • 前端开发问题:SyntaxError: “undefined“ is not valid JSON
  • Flutter 每日翻译之 Widget
  • Vue+Openlayers加载OSM、加载天地图
  • java学习——guava并发编程练习
  • 【Guava】1.0.设计虚拟机的方向
  • 第一个Flink 程序:词频统计 WordCount(流处理)
  • LeetCode--41.缺失的第一个正数
  • 《Redis》缓存与分布式锁
  • AGV选型指南:AGV智能搬运车智能问答系统助力从技术参数到供应商选择的完整方案
  • Flutter 项目开启 UI 层级虚线(UI Guides)
  • 深度学习篇---简单果实分类网络
  • JAVA 项目找不到符号
  • 零依赖Web数据管理系统:midb轻松管理
  • Node.js EventEmitter 深入解析
  • 数据挖掘:从理论到实践的深度探索
  • C++学习之STL学习:list的模拟实现