内在函数sum
的掩码是否比旧式的循环慢?
我正在为Fortran 90中的财务应用程序编写程序。 有一个用户定义的类型,它将a的50个属性混为一谈 单一债券,如账面价值,时间价值,利率,原子类型为整数,真实和特征。
type(portfolioElementType)
real(8) :: timeValue
real(8) :: bookValue
real(8) :: maturityInYears
+ many, many more
end type
整个投资组合包含一个二维矩阵,其中包含3000次10个portfolioElementType
type(portfolioElementType), dimension(:,:), pointer :: portfolio
allocate(portfolio(1:3000,1:10))
我想通过maturityInYears汇总投资组合。在SQL中,您可以将其称为逐个语句。
目前由
完成do bond = 1 to numberOfBonds
do part = 1 to numberOfParts
if (portfolio(bond,part)%maturity .eq. 10) then
sum10Years = sum10Years + portfolio(bond,part)%bookValue
end if
end do
end do
我希望纯粹出于美学原因,只能这样做:
sum10 = sum(portfolio%bookValue, mask = portfolio%maturity .eq. 10)
Booth选项给出相同的结果,但sum-approach似乎比do-loop慢。这让我感到惊讶,因为总计大约3万个元素 应该几乎毫不费力?
我的假设是,"大"用户定义的类型正在减慢速度。 我不知道Fortran如何处理它的内存结构,但我想是的 " bookValues"位于"远"在记忆中相互对立?
你认为我是否使用"大"用户定义的数据结构与" big"的用户定义数据结构相比较矩阵在某种意义上说:
portfolio(a,b)%bookValue versus
bigPortfolio%bookValue(a,b)
与
type(bigPortfolio)
real(8), dimension(1:3000,1:10), pointer :: bookValue
...many more matrices
end type