[英]Why is my C program slower than the Haskell equivalent?
我決定將Haskell的Fibonacci程序的標准嚴格尾遞歸版本與使用C語言編寫的程序的性能進行比較,使用GMP進行比較,以使結果大到適合一個詞(在Haskell中,我使用多精度Integer
類型)。 我將省略Haskell程序,因為這是有關C和GMP的問題。 C實現是這樣的:
#include <stdio.h>
#include <stdlib.h>
#include <gmp.h>
void fib(unsigned int n){
mpz_t a, b, t;
mpz_init_set_ui(a, 0);
mpz_init_set_ui(b, 1);
mpz_init(t);
for(; n > 1; n --){
mpz_add(t, a, b);
mpz_set(a, b);
mpz_set(b, t);
}
//mpz_out_str(stdout, 10, b);
}
int main(int argc, char **argv){
unsigned long n, f;
if(argc != 2){
printf("Usage: fibc <number>\n");
return 1;
}
fib(atol(argv[1]));
return 0;
}
請注意,我注釋掉了輸出值的行,這大約需要一秒鍾(我在Haskell版本中保留了此行為)。
結果是:
time ./fibhs 1000000
./fibhs 1000000 5.77s user 0.05s system 99% cpu 5.831 total
time ./fibc 1000000
./fibc 1000000 11.19s user 0.00s system 100% cpu 11.194 total
我認為我一定使用GMP錯誤。 誰能在C代碼中看到任何性能改進的可能性嗎?
打乒乓球。 您有兩個變量a和b和一個臨時t。 您將結果相加並將其放入t,然后將b復制到a並將t復制到b。 而是在將b添加到a和將a添加到b之間交替。 根據n是奇數還是偶數,最終結果是a或b。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.