コード:
書式#include <stdio.hに> する#include <stdlib.h>に含ま する#include <TIME.H> 書式#include <math.h>の 、最後開始clock_t。 / * clock_tのクロック()関数が返す変数の種類* / ダブル期間; / * 時間の測定機能、秒* / の#define多項式、即ちにおける用語のMAXN 101 / *最大数、多項式+ 1 * / # DEFINE MAXK 1E7を/ *繰り返し* /関数を呼び出しの最大数を測定 ダブル F1(INT N-、ダブル A []、ダブルX); ダブル F2(INT N-、ダブル A []、ダブルX); ボイド RUN(ダブル(*をF)(int型、ダブル *、ダブル)、ダブル A []、int型func_n); INTメイン(INTのargc、char型 のconst * ARGV []) { INT I、 ダブル A [MAXN]; / * 多項式の係数を格納する* / A [ 0 ] = 1 ; 以下のための(iは= 1 ; I <MAXN; ++ I) { [I] =(ダブル)(1.0 / I)。 } 実行(F1、1 ); 実行(F2、2 ); リターン 0 ; } 二重 F1(整数 nは、二重 A []、ダブルX) { int型私は、 ダブル pは= [ 0 ]。 以下のための式(I = 1、I <N; ++ I) { P + =([I] * POW(X、I))。 } リターンのp; } 二重 F2(整数 nは、二重 A []、ダブルX) { int型私は、 ダブル pは= [ 0 ]。 用(; I> iがN = 0 ; i-- ) { P = A [I - 1 ] + X * P。 } リターンのp; } 無効実行(ダブル(* f)は(int型、ダブル *、ダブル)、ダブル A []、int型func_n) { int型私は、 開始 = クロック()。 以下のための(iは= 0 ; I <MAXK; ++ I) { F(MAXN - 1、1.1 )。 } 端 = クロック()。 / * 定数CLK_TCK:第2の機械クロッククロックヒットポイントを取る* / DURATION =((ダブル)(完-スタート))/ CLK_TCKのために、 printf(" ティック%D =%F \ n "、func_n、(二重)(エンド開始))。 printf(" 期間は%d =%6.2e \ n " 、func_n、持続時間)。 }
結果:
実行前に実行するJavaインターセプター方法と同様開始およびメソッド呼び出しの終了をホストする関数ポインタの上記のコード巧妙な使用、
あなたは、いくつかのアクションを実行することができます。:より転載https://github.com/callmePicacho/Data-Structres/blob/master/%E4%B8%8A%E8%AF%BEDemo/1.%E8%AE%A1%E6%97%B6%E5 %AE%9E%E4%BE %8B.c
結論
テストは、F1、F2の機能がある1E7力、実行されている千万回
F1用いて10万回を実行する72.277秒
F2用いて10万回を実行6.366秒
F2アルゴリズムはF1よりも優れています。
数学速い数学関数を使用するよりも(退縮、進化)