我想學習一點朱莉婭,閱讀手冊了幾個小時後,我寫了下面的代碼:如何提高這段代碼的性能?
ie = 200;
ez = zeros(ie + 1);
hy = zeros(ie);
fdtd1d (steps)=
for n in 1:steps
for i in 2:ie
ez[i]+= (hy[i] - hy[i-1])
end
ez[1]= sin(n/10)
for i in 1:ie
hy[i]+= (ez[i+1]- ez[i])
end
end
@time fdtd1d(10000);
elapsed time: 2.283153795 seconds (239659044 bytes allocated)
我相信這是在優化,因爲它比相應的數學版慢得多:
ie = 200;
ez = ConstantArray[0., {ie + 1}];
hy = ConstantArray[0., {ie}];
fdtd1d = Compile[{{steps}},
Module[{ie = ie, ez = ez, hy = hy},
Do[ez[[2 ;; ie]] += (hy[[2 ;; ie]] - hy[[1 ;; ie - 1]]);
ez[[1]] = Sin[n/10];
hy[[1 ;; ie]] += (ez[[2 ;; ie + 1]] - ez[[1 ;; ie]]), {n,
steps}]; [email protected]; [email protected]]];
result = fdtd1d[10000]; // AbsoluteTiming
{0.1280000, Null}
那麼,如何讓fdtd1d
的Julia版本更快?
在我的電腦中,它需要0.018759438秒。您的答案使手冊的這一部分更加清晰! – xzczd
雖然我討厭承認它,但當「steps」更大時,Julia擊敗_Mathematica_ ... for steps = 10^7 _Mathematica_大約需要103秒,而Julia只需要大約19秒。 – xzczd