为什么性能测试显示列表比我的代码中的数组快得多?

Cha*_*ini -1 .net c# arrays performance list

LIST FOR      00:00:00.0000980
LIST FOREACH  00:00:00.0000007
ARRAY FOR     00:00:00.0028450
ARRAY FOREACH 00:00:00.0051233
Run Code Online (Sandbox Code Playgroud)

我一直用数组来制作性能较重的东西,但列表似乎要快得多。

using System;
using System.Diagnostics;
using System.Collections.Generic;

public class Program
{
    public static void Main()
    {
        var cron = NCrontab.Advanced.CrontabSchedule.Parse("0 0 1 1 * 2016",
            NCrontab.Advanced.Enumerations.CronStringFormat.WithYears);
        var date = new System.DateTime(year: 2016, month: 1, day: 1,
            hour: 0, minute: 0, second: 0);
        
        int[] testArray = new int[1000000];
        List<int> testList = new List<int>(1000000);
        
        var stopWatch = new Stopwatch();
        stopWatch.Start();
        for (int i = 0; i < testList.Count;i++)
        {
            var s = 1;
        }
        stopWatch.Stop();
        Console.WriteLine("LIST FOR      " + stopWatch.Elapsed);
        
        stopWatch = new Stopwatch();
        stopWatch.Start();
        foreach (int i in testList)
        {
            var d = 1;
        }
        stopWatch.Stop();
        Console.WriteLine("LIST FOREACH  " + stopWatch.Elapsed);
                
        stopWatch = new Stopwatch();
        stopWatch.Start();
        for (int i = 0; i < testArray.Length;i++)
        {
            var f = 1;
        }
        stopWatch.Stop();
        Console.WriteLine("ARRAY FOR     " + stopWatch.Elapsed);
        
        stopWatch = new Stopwatch();
        stopWatch.Start();
        foreach (int i in testArray)
        {
            var h = 1;
        }
        stopWatch.Stop();
        Console.WriteLine("ARRAY FOREACH " + stopWatch.Elapsed);
    }
}
Run Code Online (Sandbox Code Playgroud)

https://dotnetfiddle.net/RKWBJl

List内部实现了T[],只是它灵活,并且当Capacity结束时内部不断扩展。由于所有重要的操作都是在内部进行数组操作,只是为动态扩展提供了方便。

我不明白,但对于繁重且频繁的操作我需要知道。

基本上我正在尝试确定什么才是获得高 FPS 更好的方法。

Kar*_*ren 5

这些测试没有可比性。

这将创建一个包含一百万个条目的数组。

int[] testArray = new int[1000000];
Run Code Online (Sandbox Code Playgroud)

这会创建一个空列表,但在后台分配了最多可容纳一百万个条目的内存(因此在达到一百万之前,它不必调整其内部缓冲区的大小。

List<int> testList = new List<int>(1000000);
Run Code Online (Sandbox Code Playgroud)

因此,testArray.Length这里将是 1000000,并且testList.Count将是 0(因为您没有向其中添加一百万个项目)。

在性能方面,除了循环这些值之外,还需要考虑很多其他事情。例如,如果需要调整数组的大小,则添加或删除项目对于数组来说可能会非常昂贵。

第二件事是,你对这些事情进行基准测试的方法也不会真正可靠。如果您想做实际的基准测试,请查看https://benchmarkdotnet.org,它将正确执行此操作并处理诸如预热运行、内存分配、在不同框架版本上运行等事情。