ประสิทธิภาพการจัดสรรรันไทม์ของ .NET 2.0 กับ .NET 4.0

หลังจากย้ายจาก .NET 3.5 (.NET 2.0 runtime) ไปเป็น NET 4.0 เราจะเห็นประสิทธิภาพที่ลดลงเมื่อจัดสรรหน่วยความจำขนาดใหญ่ขึ้น โปรดตรวจสอบรหัสทดสอบต่อไปนี้ เป็นโปรแกรมการทดสอบที่เรียบง่ายซึ่งแสดงถึงสถานการณ์ในโลกแห่งความเป็นจริงที่เราใช้อยู่ ใครช่วยอธิบายความแตกต่างอย่างมากระหว่างรันไทม์ .NET 2.0 และ 4.0 ซึ่งช้ากว่า มาก ได้ไหม ขั้นตอนในการสืบพันธุ์:

  1. นำเข้าโค้ดลงในแอปพลิเคชันคอนโซล C#
  2. กำหนดเป้าหมายแพลตฟอร์มเป็น x64
  3. กำหนดเป้าหมาย .NET 3.5 และสร้าง Release build
  4. เรียกใช้ EXE (อย่าเรียกใช้จาก IDE!) และพิมพ์ "test" ลงในคอนโซล
  5. รอผลครับ.
  6. ทำซ้ำสำหรับ .NET 4.0

ขอบคุณ.

อเล็กซ์

    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 แหล่งที่มา
comment
รหัสของคุณจะอ่านง่ายกว่ามากหากคุณไม่มีบรรทัดว่างมากนัก ช่องว่างมีประโยชน์ แต่ไม่ใช่หลัง ทุก บรรทัด... (ฉันขอแนะนำให้คุณปฏิบัติตามรูปแบบการตั้งชื่อที่เหมาะสม แม้จะเป็นเพียงโค้ดที่ใช้แล้วทิ้งก็ตาม - ช่วยให้ทุกคนอ่านได้ง่ายขึ้น)   -  person Jon Skeet    schedule 17.10.2017
comment
นี่เป็นผลข้างเคียงของ RyuJIT ซึ่งเป็นการเขียนซ้ำของการกระวนกระวายใจ x64 ที่จัดส่งครั้งแรกใน .NET 4.6 ความกระวนกระวายใจแบบเก่ามีเครื่องมือเพิ่มประสิทธิภาพเชิงรุกมากกว่ามาก ซึ่งเป็นฟีเจอร์ที่มีความสามารถพิเศษในการเปลี่ยนเป็นข้อบกพร่อง เครื่องมือเพิ่มประสิทธิภาพแบบเก่าจะลบการเรียก getdata() ออกอย่างสมบูรณ์เนื่องจากไม่เคยใช้ค่าที่ส่งคืน ความแตกต่างที่ยิ่งใหญ่แน่นอน การที่คุณพบว่าปัญหา perf นั้นไม่น่าเป็นไปได้เลย ไม่มีใครเขียนโค้ดแบบนี้จริงๆ พิจารณาใช้ตัวสร้างโปรไฟล์กับโค้ดจริงเพื่อที่คุณจะได้จำกัดส่วนที่มีราคาแพงให้แคบลง   -  person Hans Passant    schedule 17.10.2017


คำตอบ (1)


ดังที่ Hans ชี้ให้เห็น คำตอบอยู่ที่วิธีต่างๆ ของ .NET 2 และ 4 เพิ่มประสิทธิภาพการจัดสรรหน่วยความจำที่รวดเร็วและการเรียกคืนอ็อบเจ็กต์ตั้งแต่เนิ่นๆ การเห็นว่า .NET 4 ทำงานช้าลงในโค้ดทดสอบประเภทนี้ไม่ได้หมายความว่าประสิทธิภาพจะลดลงสำหรับแอปพลิเคชันจริง ดังนั้นนี่เป็นเพียงสถานการณ์พิเศษเท่านั้น

A.

person Alex    schedule 18.10.2017