内容简介:翻译自:https://stackoverflow.com/questions/12831187/haskell-optimizing-differential-equation-solver
我正在学习Haskell,并且我正在尝试尽可能快地编写代码.在本练习中,我正在为一个简单的一维物理系统编写一个 Euler integrator
.
> C代码使用GCC 4.5.4和-O3编译.它运行在1.166秒.
> Haskell代码使用GHC 7.4.1和-O3编译.它运行21.3秒.
>如果我使用-O3 -fllvm编译Haskell,它将在4.022秒内运行.
那么,我是否遗漏了一些优化我的Haskell代码的东西?
PS.:我使用了以下参数:1e-8 5.
C代码:
#include <stdio.h>
double p, v, a, t;
double func(double t) {
return t * t;
}
void euler(double dt) {
double nt = t + dt;
double na = func(nt);
double nv = v + na * dt;
double np = p + nv * dt;
p = np;
v = nv;
a = na;
t = nt;
}
int main(int argc, char ** argv) {
double dt, limit;
sscanf(argv[1], "%lf", &dt);
sscanf(argv[2], "%lf", &limit);
p = 0.0;
v = 0.0;
a = 0.0;
t = 0.0;
while(t < limit) euler(dt);
printf("%f %f %f %f\n", p, v, a, t);
return 0;
}
Haskell代码:
import System.Environment (getArgs)
data EulerState = EulerState !Double !Double !Double !Double deriving(Show)
type EulerFunction = Double -> Double
main = do
[dt, l] <- fmap (map read) getArgs
print $runEuler (EulerState 0 0 0 0) (**2) dt l
runEuler :: EulerState -> EulerFunction -> Double -> Double -> EulerState
runEuler s@(EulerState _ _ _ t) f dt limit = let s' = euler s f dt
in case t `compare` limit of
LT -> s' `seq` runEuler s' f dt limit
_ -> s'
euler :: EulerState -> EulerFunction -> Double -> EulerState
euler (EulerState p v a t) f dt = (EulerState p' v' a' t')
where t' = t + dt
a' = f t'
v' = v + a'*dt
p' = p + v'*dt
通过将 worker-wrapper transformation
应用于runEuler,我得到了很好的提升.
runEuler :: EulerState -> EulerFunction -> Double -> Double -> EulerState runEuler s f dt limit = go s where go s@(EulerState _ _ _ t) = if t < limit then go (euler s f dt) else s
这有助于f内联到循环中(这可能也发生在C版本中),摆脱了大量的开销.
翻译自:https://stackoverflow.com/questions/12831187/haskell-optimizing-differential-equation-solver
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- NiLang:可逆计算,微分万物
- 动态规划求解最长公共子序列
- 机器学习系统SyeML笔记三——自动微分
- 最大子序列的求解-算法之一分析
- 八皇后问题分析和 golang 求解
- 漫画:一文看懂螺旋矩阵求解
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Excel图表之道
刘万祥 / 电子工业出版社 / 2010年4月 / 59.00元
本书介绍作者在实践工作中总结出来的一套“杂志级商务图表沟通方法”,告诉读者如何设计和制作达到杂志级质量的、专业有效的商务图表,作者对诸如《商业周刊》、《经济学人》等全球顶尖商业杂志上的精彩图表案例进行分析,给出其基于Excel的实现方法,包括数据地图、动态图表、仪表板等众多高级图表技巧。 本书提供大量图表模板源文件,包括详细的制作步骤,提供网上下载。提供博客支持。 本书定位于中高级Ex......一起来看看 《Excel图表之道》 这本书的介绍吧!