2

パフォーマンス テストを実行するたびに、時間が安定するまでの最初の数回の反復で、常に「時間を短縮する」時間が存在するようです。

パフォーマンス テスト コードは次のとおりです (この場合、Lambda と LINQ の違いをテストしていました)。

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

namespace Sandbox
{
    public class Program
    {
        private static long sum = 0;
        private static int count = 0;

        public class Item
        {
            public string name;
            public int id;
        }

        public static void Main(string[] args)
        {
            // START TESTING PARAMETERS
            List<Item> items = new List<Item>();

            for (int i = 0; i < 1000; i++)
            {
                items.Add(new Item
                {
                    id = i,
                    name = "name_" + i.ToString()
                });
            }

            // END TESTING PARAMETERS

            Stopwatch sw = new Stopwatch();
            sw.Start();
            for (int j = 0; j < 10; j++)
            {
                for (int i = 0; i < 5000; i++)
                {
                    // START TESTING CODE

                    Item itm = items.Find(x => x.name == "name_" + i.ToString());

                    // END TESTING CODE
                }
                sum += sw.ElapsedMilliseconds;
                count++;
                sw.Restart();
                Console.WriteLine("Average: {0}", sum / count);
            }
        }
    }
}

以下は、100,000 回のテスト実行の 5 回の反復の平均結果です。

Average: 1023    Average: 1079    Average: 1017    Average: 1147    Average: 1054
Average: 1003    Average: 963     Average: 1001    Average: 1007    Average: 1020
Average: 1009    Average: 926     Average: 951     Average: 958     Average: 966
Average: 972     Average: 908     Average: 927     Average: 934     Average: 936
Average: 946     Average: 896     Average: 922     Average: 919     Average: 918
Average: 931     Average: 889     Average: 926     Average: 910     Average: 907
Average: 919     Average: 883     Average: 916     Average: 903     Average: 899
Average: 911     Average: 880     Average: 908     Average: 898     Average: 893
Average: 904     Average: 877     Average: 902     Average: 894     Average: 899
Average: 899     Average: 874     Average: 909     Average: 891     Average: 894
Average: 895     Average: 873     Average: 926     Average: 889     Average: 890
Average: 898     Average: 871     Average: 937     Average: 886     Average: 887
Average: 898     Average: 869     Average: 944     Average: 884     Average: 907
Average: 894     Average: 868     Average: 938     Average: 882     Average: 921
Average: 891     Average: 868     Average: 934     Average: 881     Average: 923
Average: 889     Average: 867     Average: 929     Average: 880     Average: 919
Average: 887     Average: 866     Average: 925     Average: 884     Average: 916
Average: 885     Average: 866     Average: 931     Average: 892     Average: 912
Average: 889     Average: 865     Average: 927     Average: 902     Average: 909
Average: 891     Average: 870     Average: 924     Average: 907     Average: 917

テストを行うたびに、終了期間があるのはなぜですか?

4

2 に答える 2

4

その理由は、最初の反復中にほとんどのデータとコードがキャッシュされないためです。CPU キャッシュ、オペレーティング システム キャッシュ、ディスク キャッシュ、データベース キャッシュなどです。.NET や Java などの特定の実行環境では、ジャストインタイム コンパイルが役割を果たします。 、 それも。2 回目以降の反復では、データとコードがキャッシュに存在するという利点がすでにあるため、通常は実行速度が速くなります。

したがって、平均時間を測定するときは、最初の (複雑さによっては数回の) 反復を常に無視し、統計にカウントしないことをお勧めします。ただし、正確な動作は、データ セットのサイズ、アルゴリズムの複雑さ、データベースの使用状況などの依存関係、ハードウェア、およびその他の多くの要因によって異なります。

于 2013-10-15T18:28:23.847 に答える