Visual Studio การคอมไพล์แบบยาวเมื่อแทนที่ int ด้วย double


86

สำเนา VS2013 Ultimate ของฉันรวบรวมรหัสนี้เป็นเวลา 60 วินาที:

class Program
{
    static void Main(string[] args)
    {
        double dichotomy = Dichotomy(
            d =>
            {
                try
                {
                    int size = (int) d;
                    byte[] b = new byte[size];
                    return -b.Length;
                }
                catch (Exception)
                {
                    return 0;
                }
            },
            0,
            int.MaxValue,
            1);

        Console.WriteLine(dichotomy);
        Console.ReadKey();
    }

    private static double Dichotomy(
        Func<double, double> func,
        double a,
        double b,
        double epsilon)
    {
        double delta = epsilon / 10;
        while (b - a >= epsilon)
        {
            double middle = (a + b) / 2;
            double lambda = middle - delta, mu = middle + delta;
            if (func(lambda) < func(mu))
                b = mu;
            else
                a = lambda;
        }
        return (a + b) / 2;
    }
}

แต่ถ้าฉันแทนที่doubleด้วยintมันจะรวบรวมทันที จะอธิบายได้อย่างไร ... ?


คอมไพล์ในเครื่องของฉันทันทีสำหรับข้อมูลทั้งสองประเภท ... คุณกำลังรวบรวมข้อมูลบนเครื่องอะไร
Chris Mantle

1
ขีดข่วนความคิดเห็นแรกของฉัน ฉันเห็นพฤติกรรมเดียวกัน ~ 15 วินาทีด้วยและทันทีที่มีdouble intเครื่อง 3.4Ghz.
Kevin Richardson

น่าสนใจ. ฉันตรวจสอบเวอร์ชันของฉันและฉันใช้งาน VS2013 Premium - คิดว่าฉันได้ติดตั้ง Ultimate แล้ว บางทีอาจเป็นเพียงรุ่น Ultimate ที่เกิดขึ้นด้วย
Chris Mantle

1
@chris เพื่อสนับสนุนสมมติฐานดังกล่าว VS Express 2013 / Windows Desktop รวบรวมได้ดี
ClickRick

5
จากที่เคยได้ยินมา "VS2013 พฤติกรรมแปลก ๆ " แทบจะไม่แปลกเลย :)
Lightness Races ใน Orbit

คำตอบ:


140

ฉัน repro 27 วินาทีบนเครื่องของฉัน ผู้ทำชั่วคือ MsMpEng.exe ซึ่งจะเผาผลาญคอร์ 100% เป็นเวลานาน ดูง่ายในแท็บกระบวนการของตัวจัดการงาน

นี่คือบริการ Windows Defender ซึ่งเป็นบริการสแกนมัลแวร์จริงๆ การปิดใช้งานโดยการยกเลิกการเลือกตัวเลือก "เปิดการป้องกันแบบเรียลไทม์" จะช่วยแก้ไขความล่าช้าได้ทันที การเพิ่มเส้นทางที่ฉันจัดเก็บโปรเจ็กต์ลงในช่อง "ตำแหน่งไฟล์ที่ยกเว้น" ซึ่งอาจเป็นแนวทางที่คุณต้องการ

ฉันเกลียดที่จะต้องเดาด้วยเหตุผลพื้นฐาน แต่ต้องสมมติว่าซอร์สโค้ดของคุณทำให้เกิดกฎมัลแวร์ ไม่ใช่คำอธิบายที่ดีฉันไม่เห็นความล่าช้าเมื่อฉันกำหนดเป้าหมายเป็น. NET เวอร์ชัน <4.0 โอเคฉันยอมแพ้ :)


4
Omg Microsoft คุณล้อเล่นฉัน ... Tnx เพื่อขอความช่วยเหลือมันเป็นเรื่องจริงMSSEและ.Net 4.0+ใครเป็นผู้ร้าย
Alex Zhukovskiy

3
จับดี! ฉันสงสัยว่าอะไรเป็นสาเหตุของปัญหา (โดยเฉพาะอย่างยิ่งสำหรับโปรแกรมที่ง่ายมากและแทบจะไม่มีการอ้างอิงภายนอกเลย) จะเป็นไปได้ไหมที่ผลลัพธ์ของ MSIL bytes จากการคอมไพล์จะดูเหมือนรูปแบบของมัลแวร์ที่รู้จักดังนั้น MsMpEnd จะเริ่มทำงาน
tigrou

-1

ฉันไม่สามารถพูดได้อย่างเป็นทางการเพราะเป็นเวลา 20 ปีแล้วที่ฉันเล่นซอในระดับรหัสแอสเซมบลี แต่ฉันสามารถเชื่อสิ่งนี้ได้อย่างง่ายดาย

ความแตกต่างระหว่างหน่วยจุดลอยตัวมาตรฐาน IEEE กับหน่วยประมวลผลกลางที่นำไปใช้มักบังคับให้เชื่อมโยงในไลบรารีรูทีนเพื่อทำการแปลในขณะที่คณิตศาสตร์จำนวนเต็มสามารถใช้คำสั่งของ CPU ได้ ในขณะที่ IEEE กำหนดมาตรฐานพวกเขาได้ทำการเลือกบางอย่างที่ผิดปกติในการนำไปใช้งานและโดยเฉพาะอย่างยิ่งเมื่อนานมาแล้วที่มีราคาแพงกว่ามากในการใช้งานในไมโครโค้ดและแน่นอนว่าระบบพีซีในปัจจุบันถูกสร้างขึ้นโดยใช้ชิปที่สืบเชื้อสายมาจาก 80387 และ 80486 ซึ่งมาก่อนมาตรฐาน

ดังนั้นถ้าฉันพูดถูกเวลาที่เพิ่มขึ้นเป็นเพราะมันเกี่ยวข้องกับการเพิ่มโค้ดไลบรารีส่วนหนึ่งลงในลิงก์และการเชื่อมโยงเป็นส่วนสำคัญของเวลาในการสร้างที่มีแนวโน้มที่จะเพิ่มขึ้นแบบทวีคูณเมื่อมีการเพิ่มชิ้นส่วนที่ย้ายได้

เสียงดังบน Linux อาจมีหรือไม่มีการชะลอตัวเหมือนกัน หากหลีกเลี่ยงไม่ได้และขยายการคาดเดาของฉันให้ดียิ่งขึ้นนั่นจะเป็นสิ่งประดิษฐ์ของ libc หน่วยความจำที่ใช้ร่วมกันอยู่ทั่วไปทุกหนทุกแห่งที่คุณไปถึงที่นั่นและการเพิ่มประสิทธิภาพตัวเชื่อมโยง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.