在Julia中使用结构和循环时奇怪的变慢

时间:2018-10-18 14:48:53

标签: julia

在使用和不使用struct的情况下,我在两个函数之间进行了速度比较,其性能差异非常大:0.07899与0.0011 [sec]。奇怪的是,test1()test2()中idxset的内容完全相同(1 ... 10000),但是在这两个循环上的处理时间不同。请注意,仅对循环执行测量。

您能解释一下如何使用struct改进我的代码以及为什么会发生这种情况吗?

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 个答案:

答案 0 :(得分:3)

struct Data
    bool
end

在bool上没有任何类型信息,因此data.bool无法推断出类型,从而导致函数和慢速代码中无法推断出类型。 data.bool无法推断可能会使idxset无法推断,这会使每个i无法推断,并且会减慢运算速度。使用@code_warntype进行检查。使用以下方法解决此问题:

struct Data
    bool::BitArray{1}
end