CLR_VIA_C# 数组

本文通过实验比较了使用普通安全技术、交错数组技术及unsafe技术访问C#二维数组的性能差异,揭示了创建交错数组所需的时间成本及性能优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;

namespace CLR_VIA_C__数组
{
    class Program
    {
        private const Int32 c_numElements = 1000;
        static void Main(string[] args)
        {
            const Int32 testCount = 10;
            Stopwatch sw;
            //声明一个二维数组
            Int32[,] a2Dim = new Int32[c_numElements, c_numElements];
            //将一个二维数组声明为交错数组(向量构成的向量)
            Int32[][] aJagged = new Int32[c_numElements][];
            for(Int32 i=0;i<c_numElements;i++)
                aJagged[i] = new Int32[c_numElements];
            
            //1:用普通的安全技术访问数组的所有元素
            sw = Stopwatch.StartNew();
            for (Int32 i = 0; i < testCount; i++)
                Safe2DimArrayAccess(a2Dim);
            Console.WriteLine("{0}:Safe2DimArrayAccess",sw.Elapsed);

            //2:用交错数组技术访问数组的所有元素
            sw = Stopwatch.StartNew();
            for (Int32 i = 0; i < testCount; i++)
                SafeJaggedArrayAccess(aJagged);
            Console.WriteLine("{0}:SafeJaggedArrayAccess", sw.Elapsed);

            //1:用unsafe技术访问数组的所有元素
            sw = Stopwatch.StartNew();
            for (Int32 i = 0; i < testCount; i++)
                Unsafe2DimArrayAccess(a2Dim);
            Console.WriteLine("{0}:Unsafe2DimArrayAccess", sw.Elapsed);
            Console.ReadLine();
        }
        private static Int32 Safe2DimArrayAccess(Int32[,] a)
        {
            Int32 sum=0;
            for (Int32 x = 0; x < c_numElements; x++)
                for (Int32 y = 0; y < c_numElements; y++)
                    sum+=a[x,y];
            return sum;
        }
        private static Int32 SafeJaggedArrayAccess(Int32[][] a)
        {
            Int32 sum = 0;
            for (Int32 x = 0; x < c_numElements; x++)
                for (Int32 y = 0; y < c_numElements; y++)
                    sum += a[x][y];
            return sum;
        }
        private static unsafe Int32 Unsafe2DimArrayAccess(Int32[,] a)
        {
            Int32 sum = 0;
            fixed (int* pi=a)
                for (Int32 x = 0; x < c_numElements; x++)
                {
                    Int32 baseOfDim = x * c_numElements;
                    for (Int32 y = 0; y < c_numElements; y++)
                        sum += pi[baseOfDim + y];
                }
            return sum;
        }
    }
}
/************************************************************
 * 普通的安全技术访问数组速度最慢。安全交错数组时间消耗略少于安全安全二维数组访问技术
 * 但是,创建交错数组所花的时间多于创建多维数组所花的时间。因为创建交错数组时,要求在堆
 * 上为每一维分配一个对象,造成垃圾回收器的周期活动。
 * 
 * CLR VIA C# P350
 * 
 * ************************************************************/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值