- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我从玩 Haskell 中休息了很长时间,现在我开始重新投入其中。我肯定还在学习这门语言。我已经意识到,在编写 Haskell 时总是让我紧张/不舒服的一件事是,我对如何制作既惯用的算法没有很强的把握和 性能。我意识到“过早的优化是万恶之源”,但同样缓慢的代码最终必须得到处理,而且我无法摆脱我对高级语言 super 慢的先入为主的观念。
所以,在这种情况下,我开始玩测试用例。我正在研究的其中一个方法是对经典的四阶 Runge-Kutta 方法进行简单、直接的实现,应用于相当简单的 IVP dy/dt = -y; y(0) = 1
,这给 y = e^-t
.我用 Haskell 和 C 编写了一个完全直接的实现(我稍后会发布)。 Haskell 版本非常简洁,当我看到它时,它在内部给了我温暖的模糊感,但 C 版本(实际上根本不难解析)快了两倍多。
我意识到比较 2 种不同语言的性能并不是 100% 公平的;直到我们都死了,C 很可能永远是性能之王,尤其是手工优化的 C 代码。我不想让我的 Haskell 实现和我的 C 实现一样快地运行。但是我很确定,如果我更清楚自己在做什么,那么我可以从这个特定的 Haskell 实现中获得更快的速度。
Haskell 版本是用 -02
编译的在 OS X 10.8.4 上的 GHC 7.6.3 下,C 版本是用 Clang 编译的,我没有给它任何标志。使用 time
跟踪时,Haskell 版本的平均时间约为 0.016 秒,C 版本大约 0.006 秒。
这些时间考虑了二进制文件的整个运行时间,包括输出到标准输出,这显然占了一些开销,但我确实通过重新编译 -prof -auto-all
对 GHC 二进制文件进行了一些分析。并运行 +RTS -p
并使用 +RTS -s
查看 GC 统计信息.我并没有真正理解我所看到的所有内容,但似乎我的 GC 并没有失控,尽管可能会受到一点控制(5%,生产力在 ~93% 用户,~85 % total elapsed)并且大部分生产时间都花在了函数 iterateRK
上。 ,当我写它的时候我知道它会很慢,但对我来说如何清理它并不是很明显。我意识到我在使用 List 时可能会受到惩罚,无论是在常量 cons
中ing 和懒惰地将结果转储到标准输出。
我到底做错了什么?不幸的是,我没有意识到我可以使用哪些库函数或 Monadic 魔法来清理 iterateRK
?有哪些学习如何成为 GHC 分析摇滚明星的好资源?
RK.hs
rk4 :: (Double -> Double -> Double) -> Double -> Double -> Double -> Double
rk4 y' h t y = y + (h/6) * (k1 + 2*k2 + 2*k3 + k4)
where k1 = y' t y
k2 = y' (t + h/2) (y + ((h/2) * k1))
k3 = y' (t + h/2) (y + ((h/2) * k2))
k4 = y' (t + h) (y + (h * k3))
iterateRK y' h t0 y0 = y0:(iterateRK y' h t1 y1)
where t1 = t0 + h
y1 = rk4 y' h t0 y0
main = do
let y' t y = -y
let h = 1e-3
let y0 = 1.0
let t0 = 0
let results = iterateRK y' h t0 y0
(putStrLn . show) (take 1000 results)
#include<stdio.h>
#define ITERATIONS 1000
double rk4(double f(double t, double x), double h, double tn, double yn)
{
double k1, k2, k3, k4;
k1 = f(tn, yn);
k2 = f((tn + h/2), yn + (h/2 * k1));
k3 = f((tn + h/2), yn + (h/2 * k2));
k4 = f(tn + h, yn + h * k3);
return yn + (h/6) * (k1 + 2*k2 + 2*k3 + k4);
}
double expDot(double t, double x)
{
return -x;
}
int main()
{
double t0, y0, tn, yn, h, results[ITERATIONS];
int i;
h = 1e-3;
y0 = 1.0;
t0 = 0.0;
yn = y0;
for(i = 0; i < ITERATIONS; i++)
{
results[i] = yn;
yn = rk4(expDot, h, tn, yn);
tn += h;
}
for(i = 0; i < ITERATIONS; i++)
{
printf("%.10lf", results[i]);
if(i != ITERATIONS - 1)
printf(", ");
else
printf("\n");
}
return 0;
}
最佳答案
使用更大的程序会导致堆栈溢出:
Stack space overflow: current size 8388608 bytes.
Use `+RTS -Ksize -RTS' to increase it.
{-# LANGUAGE BangPatterns #-}
iterateRK :: (Double -> Double -> Double) -> Double -> Double -> Double -> [Double]
iterateRK y' !h !t0 !y0 = y0:(iterateRK y' h t1 y1)
where t1 = t0 + h
y1 = rk4 y' h t0 y0
%GC time 2.5% (2.9% elapsed)
$ time ./tesths; time ./testc
2.47e-321
./tesths 0,73s user 0,01s system 86% cpu 0,853 total
2.470328e-321
./testc 0,51s user 0,01s system 95% cpu 0,549 total
time ./tesths; time ./testc
2.47e-321
./tesths 18,25s user 0,04s system 96% cpu 19,025 total
2.470328e-321
./testc 16,98s user 0,14s system 98% cpu 17,458 total
{-# LANGUAGE BangPatterns #-}
import qualified Data.List.Stream as S
rk4 :: (Double -> Double -> Double) -> Double -> Double -> Double -> Double
rk4 y' !h !t !y = y + (h/6) * (k1 + 2*k2 + 2*k3 + k4)
where k1 = y' t y
k2 = y' (t + h/2) (y + ((h/2) * k1))
k3 = y' (t + h/2) (y + ((h/2) * k2))
k4 = y' (t + h) (y + (h * k3))
iterateRK :: (Double -> Double -> Double) -> Double -> Double -> Double -> [Double]
iterateRK y' h = curry $ S.unfoldr $ \(!t0, !y0) -> Just (y0, (t0 + h, rk4 y' h t0 y0))
main :: IO ()
main = do
let y' t y = -y
let h = 1e-3
let y0 = 1.0
let t0 = 0
let results = iterateRK y' h t0 y0
print $ S.head $ (S.drop (pred 10000000) results)
$ ghc -O2 ./test.hs -o tesths -fllvm
$ time ./tesths; time ./testc
2.47e-321
./tesths 15,85s user 0,02s system 97% cpu 16,200 total
2.470328e-321
./testc 16,97s user 0,18s system 97% cpu 17,538 total
$ time ./tesths; time ./testc
2.47e-321
./tesths 15,86s user 0,01s system 98% cpu 16,141 total
2.470328e-321
./testc 15,88s user 0,02s system 98% cpu 16,175 total
关于performance - Haskell 性能 : Struggling with utilizing profiling results and basic tuning techniques (eliminating explicit recursion, 等),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18578370/
这一章我们介绍在下游任务微调中固定LM参数,只微调Prompt的相关模型。这类模型的优势很直观就是微调的参数量小,能大幅降低LLM的微调参数量,是轻量级的微调替代品。和前两章微调LM和全部冻结的pr
LLM微调方法(Efficient-Tuning)六大主流方法:思路讲解&优缺点对比[P-tuning、Lora、Prefix tuing等] 由于LLM参数量都是在亿级以上,少则数十亿,多
微调 API 中关于 model 属性的 OpenAI 文档说明有点令人困惑: model The name of the base model to fine-tune. You can selec
微调 API 中关于 model 属性的 OpenAI 文档说明有点令人困惑: model The name of the base model to fine-tune. You can selec
我正在尝试使用带有调整网格的 Caret 创建模型 svmGrid up_inside Support Vector Machines with Linear Kernel 100 samples
当涉及到语言模型(LLM)的教学微调时,什么时候应该选择有监督的微调培训器(SFTTrainer)而不是常规的Transformers培训器?据我所知,常规的Transformers培训人员通常指的是
RHEL/CentOS 在 6.3 版本以后引入了一套新的系统调优工具 tuned/tuned-adm,其中 tuned 是服务端程序,用来监控和收集系统各个组件的数据,并依据数据提供的信息动态调整
关闭。这个问题需要debugging details .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 2年前关闭。 Improve this questio
我有一个大约 4MB 的文件,该文件是一个仅包含普通键盘字符的 ascii 文件。我尝试了 java.io 包中的许多类来将文件内容读取为字符串。逐个字符地读取它们(使用 FileReader 和 B
之一: torchvision 中包含了很多预训练好的模型,这样就使得 fine-tune 非常容易。本文主要介绍如何 fine-tune torchvision 中预训练好的模型。 安装
有没有办法停止ray.tune实验(例如使用 PBT)当明显过度拟合或一个指标长时间没有改善时? 最佳答案 现在,这在 Tune 中得到了很好的支持,https://github.com/ray-pr
构建 LINQ 表达式(对我来说,是 linq to object)时,有很多方法可以完成某件事,其中一些方法比其他方法更好、更高效。 有没有好的方法来“调整”或优化这些表达式? 人们采用哪些基本指标
我正在尝试保存一个经过微调的 bert 模型。我已经正确运行了代码 - 它工作正常,并且在 ipython 控制台中我可以调用 getPrediction 并让它产生结果。 我已保存体重文件(最高的是
我有这样的查询。 SELECT count(*) FROM table1 e WHERE e.column1=1 AND e.id IN (SELECT MAX(ID) FROM
我在 node.js 上使用 ffmpeg。并选择“-tune Zerolatency”以实现低延迟 但是当我插入“-tune Zerolatency”时,出现错误:无法识别的选项“tune”。 有人
我目前正在训练 CNN 来对波进行分类。虽然代码运行完美,但用于超参数调整的 GridSearchCV 无法按预期工作。我很困惑,因为我在 MLP 中使用了类似的代码来调整超参数,而且效果很好。这是完
我的应用程序在我的 iPad 上运行。但它的表现非常糟糕——我的速度低于 15fps。谁能帮我优化一下? 它基本上是一个轮子(派生自 UIView),包含 12 个按钮(派生自 UIControl)。
SQL Turning 是Quest公司出品的Quest Central软件中的一个工具。Quest Central是一款集成化、图形化、跨平台的数据库管理解决方案,可以同时管理 Oracle、DB
让事件记录在开发环境中对所有查询使用 SQL_NO_CACHE 的简单方法是什么? 我想优化最坏情况加载时间的语句。希望这样做是有意义的,但是我在第一页命中时查询非常慢,而下次所有查询都非常快,因为服
我有一个电子邮件数据集,我正在使用 SVM 来确定电子邮件是否是垃圾邮件 我将数据集分为测试和训练,然后随机挑选了一组 500 条记录来调整 svm。我正在使用 RBF 内核。以下是原始数据 make
我是一名优秀的程序员,十分优秀!