2016-09-27 10 views
1

私は自動的にベンチに巧妙なマクロCの「プロセス」を作成することが可能であるならば不思議とだけC.だが、私はこのような小さな構造を持っているとしましょう使用しています:Cで自動的にベンチマークするための巧妙なマクロを作成する方法ですか?

typedef struct pbench { 
    char description[256]; 
    int nbenchs; 
    double times; 
} ProcessBench; 

とマクロ(とget_time())はdoubleを返す関数である:

#define BENCH(process, bench_struct, description)  \ 
    int i;            \ 
    bench_struct.description = description;    \ 
    bench_struct.nbenchs = 50;       \ 
    double start = get_time();       \ 
    for (i = 0; i < bench_struct.nbenchs; ++i)   \ 
    process();           \ 
    bench_struct.times = get_time() - start; 

私は間違っていない場合は、このマクロは、ベンチマークにBENCH(func, func_bench, func_description)を使用して署名void func()で任意の関数を使用することができます。

void func_args(args...)return_type func_return()return_type func_return(args...)、さらには小さな行のようなベンチマーク機能にこのようなマクロを作成する方法はありますか?

+0

機能も動作するマクロを使用しないでください。 – Olaf

+0

@Olaf:Cの関数でこれを行うことは困難です。特に、時間指定された関数に任意のパラメータが必要な場合は特にそうです。 –

+0

@PaulR:私はOPが示すものを参照します。パラメータはありません。しかし、この文脈で "プロセス"とは何を意味するのかは不明です。あるいは、2つの関数とマクロの混合がオプションになります。いずれにしても、上記のマクロは私にとってはとても元気ではありません。 – Olaf

答えて

2

パラメータを含む関数呼び出し全体を渡すだけで、関数の結果を無視することができます。

#define BENCH(process, bench_struct, description)  \ 
    int i;            \ 
    bench_struct.description = description;    \ 
    bench_struct.nbenchs = 50;       \ 
    double start = get_time();       \ 
    for (i = 0; i < bench_struct.nbenchs; ++i)   \ 
    process;           \ 
    bench_struct.times = get_time() - start; 

BENCH(func(x, y, z), func_bench, func_description) 

(マクロに小さな変更を注 - 括弧はprocessから除去されている。)

+1

うわー。それは簡単でしたか? >< – baptiste

+0

@baptiste:はい、解決策が予想以上に簡単な稀な機会の1回です。 ;-) –

+3

'i'との衝突を避けるためにブロックで囲むと良いでしょう。それが[do {...} while(0) ']の場合でもさらに優れています(http://stackoverflow.com/questions/154136/why-use-apparently-meaningless-do-while-and-if-else-ステートメント・イン・cc-マクロ)。 –

関連する問題