在使用和不使用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()
答案 0 :(得分:3)
struct Data
bool
end
在bool上没有任何类型信息,因此data.bool
无法推断出类型,从而导致函数和慢速代码中无法推断出类型。 data.bool
无法推断可能会使idxset
无法推断,这会使每个i
无法推断,并且会减慢运算速度。使用@code_warntype
进行检查。使用以下方法解决此问题:
struct Data
bool::BitArray{1}
end