สองวงที่แตกต่างกันหรือสองเงื่อนไขในการเปรียบเทียบความเร็วลูป

Aug 17 2020

ตอนนี้ฉันมีสองห่วงและข้างในมีงานมอบหมายบางอย่าง แต่ฉันต้องทำให้เร็วที่สุด

        for (var i = 0; i < Math.Min(data.elementsOne.Count(), 5)) ; i++) {
            if (data.PairSymbol == "xxx") { oldxxxA = xxxAa; xxxAa = data.elementsOne[0].Amount; oldxxxB = xxxBb; xxxBb = data.elementsTwo[0].Amount; }
            //I HAVE 20 IF BLOCK INSIDE OF IT.  
        }
        for (var i = 0; i < (Math.Min(data.elementsOne.Count(), 5)) || i < Math.Min(data.elementsTwo.Count(), 5); i++)
        {
            if (data.PairSymbol == "xxx") { oldxxxA = xxxAa; xxxAa = data.elementsOne[0].Amount; oldxxxB = xxxBb; xxxBb = data.elementsTwo[0].Amount; }
            //I HAVE 20 IF BLOCK INSIDE OF IT.  
        }

เมื่อฉันพยายามให้ได้ผลลัพธ์ที่ดีขึ้นฉันคิดว่าฉันทำได้เหมือนด้านล่าง แต่ผลลัพธ์ดูแย่ลง

    for (var i = 0; i < (Math.Min(data.elementsOne.Count(), 5)) || i < Math.Min(data.elementsTwo.Count(), 5); i++)
    {
        if (data.PairSymbol == "xxx") { oldxxxA = xxxAa; xxxAa = data.elementsOne[0].Amount; oldxxxB = xxxBb; xxxBb = data.elementsTwo[0].Amount; } 
        //I HAVE 20 IF BLOCK INSIDE OF IT.                          
    }

เกิดอะไรขึ้น ? ฉันจะเร่งความเร็วได้อย่างไร? (สิ่งที่สำคัญที่สุดคือความเร็วอย่าคิดว่าหน่วยความจำ)

ปล. ฉันเปลี่ยนรหัสเนื่องจากปัญหาด้านความปลอดภัยบางอย่างไม่ทราบข้อผิดพลาดทางไวยากรณ์และ elementsOne.count = elementsTwo.count เหมือนกันเกือบตลอดเวลา อย่าคิดว่ามีเพียง 5 รายการที่อยู่ในวงมีอีกวงหนึ่งอยู่ข้างนอกวงต่อเนื่อง ขออภัยสำหรับภาษาอังกฤษของฉัน

คำตอบ

1 l33t Aug 17 2020 at 17:53

เพื่อประสิทธิภาพคุณควรหลีกเลี่ยงการมีifข้อความในลูปของคุณอย่างแน่นอน ifสาเหตุแตกแขนงซึ่งหมายความว่าคุณจะอยู่ในมือของตัวทำนายที่สาขาของ CPU

ดังนั้นใช่คุณมากจะมีโอกาสได้เห็นประสิทธิภาพที่ดีขึ้นถ้าคุณมี 20 ลูปโดยไม่ต้องมีifคำสั่งที่จะเป็นจริงในเช่น 5% ของกรณีที่ ลองดูว่าช่วยได้ไหม นอกจากนี้ตรวจสอบให้แน่ใจว่าได้แคชค่าของCount()as ที่อาจบ่งบอกถึงการวนซ้ำเพิ่มเติม