在Julia中使用struct和loop时速度会奇怪地减慢

在Julia中使用struct和loop时速度会奇怪地减慢,julia,Julia,我对使用和不使用struct的两个函数进行了速度比较,如下所示,其性能差异非常大:0.07899 vs 0.0011[秒]。奇怪的是,test1()和test2()中idxset的内容完全相同(1…10000),但这两个循环的处理时间不同。请注意,测量仅针对回路进行 你能解释一下如何用struct改进我的代码,以及为什么会这样吗 struct Data bool end function test1() N = 10^5 data = Data(trues(N))

我对使用和不使用struct的两个函数进行了速度比较,如下所示,其性能差异非常大:0.07899 vs 0.0011[秒]。奇怪的是,
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()
没有关于bool的任何类型信息,因此
data.bool
无法推断类型,导致函数中的类型未找到,代码速度变慢
data.bool
被取消查询可能会导致
idxset
被取消查询,这会导致每个
i
被取消查询并减慢运算速度。请使用
@code\u warntype
检查此项。用以下方法解决此问题:

struct Data
    bool::BitArray{1}
end

或者,如果您不费心手动找出确切的类型(
BitArray{1}
)和/或保留
数据,请选择
struct Data{T}bool::T end
struct Data
    bool::BitArray{1}
end