Kinerja alokasi runtime .NET 2.0 vs .NET 4.0

setelah bermigrasi dari .NET 3.5 (runtime .NET 2.0) ke NET 4.0 kita dapat melihat penurunan kinerja saat mengalokasikan potongan memori yang lebih besar. Silakan tinjau kode tes berikut. Ini adalah program pengujian minimalis yang mewakili skenario dunia nyata yang kami gunakan. Adakah yang bisa menjelaskan perbedaan dramatis antara waktu proses .NET 2.0 dan 4.0, yang jauh lebih lambat? Langkah-langkah untuk memperbanyak:

  1. Impor kode ke aplikasi konsol C#.
  2. Tetapkan target platform ke x64.
  3. Targetkan .NET 3.5 dan buat versi Rilis.
  4. Jalankan EXE (JANGAN jalankan dari IDE!) dan ketik "test" di konsol.
  5. Tunggu hasilnya.
  6. Ulangi untuk .NET 4.0.

Terima kasih.

Alex

    class Program {

    static DateTime firstdate, lastdate;

    const int CHUNKSIZE =  10 * 1024 * 1024; //  10 MB.
    const int TRIALS = 10000;

    static void startmeasure() {

        firstdate = DateTime.Now;

    }

    static void stopmeasure() {

        lastdate = DateTime.Now;

        var duration = lastdate.Subtract(firstdate);

        Console.WriteLine("Test duration:" + duration.TotalSeconds.ToString());

    }

    static void Main(string[] args) {

        string input;

        do {

            input = Console.ReadLine();

            switch (input) {

                case "test":

                    handletest();

                    break;

            }

        } while (input != "exit");

    }

    static void handletest() {

        startmeasure();

        byte[] data;

        for (int i = 0; i < TRIALS; i++) {

            data = getdata(CHUNKSIZE);

        }

        stopmeasure();

    }

    static byte[] getdata(int size) {

        return new byte[size];

    }

}

person Alex    schedule 17.10.2017    source sumber
comment
Kode Anda akan jauh lebih mudah dibaca jika Anda tidak memiliki banyak baris kosong. Spasi memang berguna, tetapi tidak setelah setiap baris... (Saya juga menyarankan Anda untuk mengikuti konvensi penamaan yang sesuai bahkan untuk kode sekali pakai - ini memudahkan semua orang untuk membacanya.)   -  person Jon Skeet    schedule 17.10.2017
comment
Ini adalah efek samping dari RyuJIT, penulisan ulang jitter x64 yang pertama kali dikirimkan di .NET 4.6. Jitter lama memiliki pengoptimal yang jauh lebih agresif, sebuah fitur yang cenderung berubah menjadi bug. Pengoptimal lama sepenuhnya menghapus panggilan getdata() karena nilai kembaliannya tidak pernah digunakan. Perbedaan besar tentunya. Kemungkinan besar Anda tidak menemukan masalah kinerja, tidak ada yang benar-benar menulis kode seperti ini. Pertimbangkan untuk menggunakan profiler pada kode asli sehingga Anda dapat mempersempit bagian yang mahal.   -  person Hans Passant    schedule 17.10.2017


Jawaban (1)


Seperti yang ditunjukkan Hans, jawabannya terletak pada berbagai cara .NET 2 dan 4 mengoptimalkan alokasi memori cepat dan pengambilan kembali objek awal. Melihat kinerja .NET 4 lebih lambat dalam kode pengujian semacam ini tidak berarti kinerjanya lebih rendah untuk aplikasi sebenarnya, jadi ini hanyalah situasi khusus.

A.

person Alex    schedule 18.10.2017