gpt4 book ai didi

performance - OCaml 优化技术

转载 作者:行者123 更新时间:2023-12-03 12:38:13 26 4
gpt4 key购买 nike

我是 OCaml 的新手(在 Haskell 中有一些先验知识)。我想说服自己采用 OCaml。因此我试图比较 C 和 OCaml 之间的性能。我写了以下朴素的 Monte Carlo Pi-finder:

C版

#include <stdio.h>
#include <stdlib.h>

int main(int argc, const char * argv[]) {

const int N = 10000000;
const int M = 10000000;

int count = 0;
for (int i = 0; i < N; i++) {
double x = (double)(random() % (2 * M + 1) - M) / (double)(M);
double y = (double)(random() % (2 * M + 1) - M) / (double)(M);
if (x * x + y * y <= 1) {
count++;
}
}

double pi_approx = 4.0 * (double)(count) / (double)(N);
printf("pi .= %f", pi_approx);
return 0;
}

Ocaml 版本
let findPi m n = 
let rec countPi count = function
| 0 -> count
| n ->
let x = float_of_int (Random.int (2 * m + 1) - m) /. (float_of_int m) in
let y = float_of_int (Random.int (2 * m + 1) - m) /. (float_of_int m) in
if x *. x +. y *. y <= 1. then
countPi (count + 1) (n - 1)
else
countPi count (n - 1) in
4.0 *. (float_of_int (countPi 0 n)) /. (float_of_int n);;

let n = 10000000 in
let m = 10000000 in

let pi_approx = findPi m n in
Printf.printf "pi .= %f" pi_approx

我用 Clang(Apple LLVM 5.1 版)编译了 C,用 ocamlopt v4.01.0 编译了 OCaml。

C的运行时间为0.105s。 OCaml 是 0.945s,慢 9 倍。我的目标是将 OCaml 的运行时间减少 3 倍,使程序可以在 0.315s 内完成。

由于我是 OCaml 的新手,我想学习一些 OCaml 优化技术。请给我一些建议! (已经应用了尾递归,否则程序会因stackoverflow而崩溃)

最佳答案

这是我在两个测试中使用相同的随机数生成器时看到的结果。

这是从 OCaml 调用 random() 的 stub :

#include <stdlib.h>

#include <caml/mlvalues.h>

value crandom(value v)
{
return Val_int(random());
}

这是修改后的 OCaml 代码:
external crandom : unit -> int = "crandom"

let findPi m n =
let rec countPi count = function
| 0 -> count
| n ->
let x = float_of_int (crandom () mod (2 * m + 1) - m) /. (float_of_int m) in
let y = float_of_int (crandom () mod (2 * m + 1) - m) /. (float_of_int m) in
if x *. x +. y *. y <= 1. then
countPi (count + 1) (n - 1)
else
countPi count (n - 1) in
4.0 *. (float_of_int (countPi 0 n)) /. (float_of_int n);;

let n = 10000000 in
let m = 10000000 in

let pi_approx = findPi m n in
Printf.printf "pi .= %f" pi_approx

我还原封不动地复制了您的 C 代码。

这是一个 session ,显示了我的 Mac(2.3 GHz Intel Core i7)上的两个程序:
$ time findpic
pi .= 3.140129
real 0m0.346s
user 0m0.343s
sys 0m0.002s
$ time findpic
pi .= 3.140129
real 0m0.342s
user 0m0.340s
sys 0m0.001s
$ time findpiml
pi .= 3.140129
real 0m0.396s
user 0m0.394s
sys 0m0.002s
$ time findpiml
pi .= 3.140129
real 0m0.395s
user 0m0.393s
sys 0m0.002s

看起来 OCaml 代码慢了大约 15%。

我根本没有试图让它更快,我只是用 C 代码正在使用的随机数生成器替换了随机数生成器。

您的代码实际上似乎很难改进(即,它是好代码)。

编辑

(我重写了 stub 以使其更快。)

关于performance - OCaml 优化技术,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24463701/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com