netcore 提升list性能 CollectionsMarshal.AsSpan

模板一:安全的批量数据处理

public staticclass SafeListProcessor
{
    publicstaticvoid ProcessInPlace<T>(List<T> list, Action<T[]> processor)
    {
        if (list.Count == 0) return;

        int originalCapacity = list.Capacity;

        T[] items = list.ToArray();

        processor(items);

        for (int i = 0; i < list.Count && i < items.Length; i++)
        {
            list[i] = items[i];
        }

        Debug.Assert(list.Capacity == originalCapacity, "List was modified during processing!");
    }
}

模板二:高性能数值计算

using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Text;

namespace MathExtensionsDemo
{
    publicstaticclass MathExtensions
    {
        public static void ApplyTransform(this List<float> values, Func<float, float> transform)
        {
            var span = CollectionsMarshal.AsSpan(values);
            for (int i = 0; i < span.Length; i++)
            {
                span[i] = transform(span[i]);
            }
        }

        public static float FastSum(this List<float> values)
        {
            var span = CollectionsMarshal.AsSpan(values);
            float sum = 0f;
            for (int i = 0; i < span.Length; i++)
            {
                sum += span[i];
            }
            return sum;
        }
    }

    internal class Program
    {
        static void Main(string[] args)
        {
            // 设置控制台为 UTF-8,确保中文输出正常
            Console.OutputEncoding = Encoding.UTF8;

            Console.WriteLine("演示:MathExtensions(ApplyTransform 与 FastSum)");
            Console.WriteLine();

            // 示例 1:普通列表,给每个元素 +10,然后求和
            var list1 = new List<float> { 1f, 2f, 3f, 4f, 5f };
            Console.WriteLine("示例 1 - 原始列表: " + string.Join(", ", list1));
            list1.ApplyTransform(x => x + 10f);
            Console.WriteLine("示例 1 - 变换后: " + string.Join(", ", list1));
            Console.WriteLine($"示例 1 - FastSum: {list1.FastSum()}");
            Console.WriteLine();

            // 示例 2:乘法变换
            var list2 = new List<float> { 1.5f, 2f, -3f };
            Console.WriteLine("示例 2 - 原始列表: " + string.Join(", ", list2));
            list2.ApplyTransform(x => x * 2f);
            Console.WriteLine("示例 2 - 变换后: " + string.Join(", ", list2));
            Console.WriteLine($"示例 2 - FastSum: {list2.FastSum()}");
            Console.WriteLine();

            // 示例 3:空列表(应为 no-op)
            var empty = new List<float>();
            Console.WriteLine("示例 3 - 空列表,ApplyTransform 与 FastSum 测试");
            empty.ApplyTransform(x => x + 1f); // 不会抛异常
            Console.WriteLine("示例 3 - 变换后仍为空,FastSum = " + empty.FastSum());
            Console.WriteLine();

            // 示例 4:破坏性示例(演示风险 —— 不推荐在生产中这样做)
            // 注意:在 transform 中修改原 list 的结构(Add/Remove)可能导致未定义行为或异常。
            var list3 = new List<float>(capacity: 4) { 1f, 2f, 3f, 4f };
            Console.WriteLine("示例 4 - 破坏性示例(演示危险行为,不推荐)");
            Console.WriteLine("示例 4 - 变换前: " + string.Join(", ", list3));
            try
            {
                list3.ApplyTransform(x =>
                {
                    // 在处理器里修改原 list(会改变底层数组),这是危险操作
                    if (x == 2f)
                    {
                        list3.Add(99f);
                    }
                    return x + 1f;
                });

                Console.WriteLine("示例 4 - 变换后(注意:行为平台/实现相关,可能不一致): " + string.Join(", ", list3));
                Console.WriteLine($"示例 4 - FastSum: {list3.FastSum()}");
            }
            catch (Exception ex)
            {
                Console.WriteLine("示例 4 - 处理期间抛出异常(这是预期风险的一部分):");
                Console.WriteLine(ex);
            }
            Console.WriteLine();

            // 示例 5:大列表性能测试(简单计时)
            var rand = new Random(0);
            var big = new List<float>(capacity: 1_000_000);
            for (int i = 0; i < 1_000_000; i++)
                big.Add((float)rand.NextDouble());

            Console.WriteLine("示例 5 - 大列表性能测试(1,000,000 个元素)");
            var sw = System.Diagnostics.Stopwatch.StartNew();
            big.ApplyTransform(x => x * 1.000001f); // 轻微变化
            sw.Stop();
            Console.WriteLine($"ApplyTransform 用时: {sw.ElapsedMilliseconds} ms");

            sw.Restart();
            var sum = big.FastSum();
            sw.Stop();
            Console.WriteLine($"FastSum = {sum},用时: {sw.ElapsedMilliseconds} ms");
            Console.WriteLine();

            Console.WriteLine("演示结束。按任意键退出。");
            Console.ReadKey();
        }
    }
}

作者:spike

分类: Net

创作时间:2025-10-18

更新时间:2025-10-19

联系方式放在中括号之中例如[[email protected]],回复评论在开头加上标号例如:#1