2016-04-30 2 views
0


私は一方で、私はこのようにdlsym()を使用してwrite()を起動し、Cでwrite()などのシステムコールを呼び出す:システムコールまたはdlsym?どの方が速いの?

ssize_t original_write(int fd, const void *buf, size_t count) 
{ 
    typedef ssize_t (*orig_write_type)(int, const void *, size_t); 
    static orig_write_type orig_write; 
    if (!orig_write) 
     orig_write = (orig_write_type) dlsym(RTLD_NEXT, "write"); 
    ssize_t ret = orig_write(fd, buf, count); 
    return ret; 
} 

私が速くなる方法好奇心?私がwrite()と呼ぶと、それは暗黙のうちにdlsym()を呼び出してそのアドレスを得るでしょうか?私を修正してください。あなたのお時間をありがとうございました。

+0

コンパイラはおそらく両方とも同じコードになります。 – Leandros

+1

より速いのは何ですか?あなたは自分でそれを測定することができます... –

+2

Cは 'dlsym()'について何も言わない - それはCによって定義された標準ライブラリ関数の中にはありません。さらに、 'dlsym()'を使って実装を見つけるのは非常に驚きです関数呼び出しを動的ライブラリに実装する。ダイナミックライブラリを備えたシステムには、通常、ダイナミックリンカが必要ありません。しかし全体的に、なぜあなたのプログラムにこのような醜い混乱を加えたいのですか? –

答えて

1

「どちらが速いのですか」という質問に関しては、プロファイラを使用してコードを自分で作成してください。

言われているように、スタティックコールは常に最初のコールのダイナミックコールより速くなります。関数が動的に読み込まれると、2つはで実行され、ほぼ同じ速度のになります。ここに示した動的アプローチでは、2つの追加の命令を使用してstatic変数をチェックしているため、動的呼び出しは、スタティック呼び出しと同じくらい速くになりません。

static変数をすべて削除することで回避できます。スタブ関数を記述し、そのスタブを指す関数ポインタ変数を宣言します。スタブに実際の関数をロードさせ、変数を指すように変数を更新してから呼び出します。次に、すべての呼び出しに関数ポインタを使用できます。最初の時間はスタブを呼び出し、その後のすべての時間は実際の関数を直接呼び出します。

関連する問題