मैंने नीचे के रूप में संरचना का उपयोग किए बिना और बिना दो कार्यों के बीच गति-तुलना की, और इसका प्रदर्शन अंतर बहुत बड़ा है: 0.07899 बनाम 0.0011 [सेकंड]। अजीब बात यह है कि test1() और test2() में idxset की सामग्री बिल्कुल समान है(1...10000) लेकिन उन दोनों पर लूप का प्रसंस्करण समय अलग है। ध्यान दें कि माप केवल छोरों के लिए किए गए थे।

क्या आप समझा सकते हैं कि संरचना के साथ मेरे कोड को कैसे सुधारें और ऐसा क्यों होता है?

struct Data
    bool
end
function test1()
    N = 10^5
    data = Data(trues(N))
    idxset = findall(data.bool)

    s=0.0
    @time for i in idxset
        s += i^2
    end
    return s
end

function test2()
    N = 10^5
    bool = trues(N)
    idxset = findall(bool)

    s=0.0
    @time for i in idxset
        s += i^2
    end
    return s
end
test1()
test2()
1
orematasaburo 18 अक्टूबर 2018, 17:48

1 उत्तर

सबसे बढ़िया उत्तर
struct Data
    bool
end

बूल पर किसी प्रकार की जानकारी नहीं है, इसलिए data.bool प्रकार का अनुमान नहीं लगा सकता है, जिससे आपके फ़ंक्शन और धीमे कोड में गैर-अनुमानित प्रकार हो सकते हैं। data.bool का अनुमान नहीं लगाने से शायद idxset का अनुमान नहीं लगाया जा सकता है, जो हर i को बेबुनियाद बना देता है और अंकगणित को धीमा कर देता है। इसे @code_warntype से जांचें। इसे इसके साथ ठीक करें:

struct Data
    bool::BitArray{1}
end
3
Chris Rackauckas 18 अक्टूबर 2018, 14:54