8

-fPIC フラグによって、C プログラムのパフォーマンスが大きく異なることに気付きました。私がそれを使用すると、プログラムは使用しない場合よりも約 30% 遅くなります。C関数を呼び出すLuaプログラムと比較しています(すべての重い計算が行われます)。まず、C 関数で共有オブジェクトを作成したので、-fPIC フラグを使用する必要がありました。パフォーマンスは、-fPIC フラグを使用した C コードと非常に似ています。だから今、私は.soなしで同じことを試みました:私はCからLuaを呼び出しました:

int main()
{
    lua_State* L = luaL_newstate();
    luaL_openlibs(L);
    lua_register(L, "my_c_function", my_c_function);
    luaL_dofile(L, "my_lua_program.lua");
    lua_close(L);
    return 0;
}

ただし、ここでは、-fPIC フラグを使用するかどうかに関係なく、パフォーマンスは同じです (.so を使用したアプローチと同じです)。-fPIC フラグなしで何らかの改善を期待していました...さらに調査するにはどうすればよいかについてのアドバイスはありますか? とにかく位置に依存しないコードを作成する2番目のアプローチですか?それがパフォーマンスが似ている理由ですか?ありがとう!

コメントで示唆されている詳細情報: -O3 フラグ、gcc 4.7.2、Ubuntu 12.04.2、x86_64 を使用します。はい、私は非常に大きなオーバーヘッドに非常に驚きました...私のプログラムはマンデルブローフラクタルを計算しています。したがって、x と y を反復する 2 つのループがあり、C にある関数は isMandelbrot です。反復回数を取り、bool を返します。Mandelbrot セットに属するかどうか。「require」で共有オブジェクトを使用します。

4

2 に答える 2

1

あなたが実行しているコードはx86だと思います。このプラットフォームには -fPIC のパフォーマンスの問題があり、インポートされた関数の場所にはローカルの eip を見つける必要があります。これを行うコードは、関数にわずかなオーバーヘッドを追加します。残念ながら、lua は非常に小さな関数でいっぱいであり、相対的なオーバーヘッドが増加します。

x64 では、-fPIC にはこのオーバーヘッドはありません。

于 2015-08-20T06:37:22.587 に答える
-4

まず第一に、C プログラムを C プログラムで呼び出しても、lua で C プログラムを呼び出しても、ほとんど違いはありませんが、C プログラムが作成されるたびに、すべてのシステム ヘッダーがポップされる独立したプログラムが作成されます。やっていることをやり終えた後、値を報告します。私の要点は、プログラムを呼び出した後にやるべきことがたくさんあるので、問題は「呼び出し」機能ではなく、その数と速度である可能性があるということです。

o3 最適化フラグはあまり健全ではないため、一度これを行った場合は、-Os を使用しないで、-Ofast も試してください。さらに悪い結果になる可能性があります...

パフォーマンスを改善する最も簡単な方法は、C コードを最適化することです。コンパイル中に最適化フラグを試してみてください。ここには、GCC コンパイラーの下にあるフラグとそれらに関する多くのドキュメントがあります。それらのすべてが安全であるとは限らず、すべてが本当に必要なわけではないことに注意してください。そのため、コードを分析して、必要なものだけを選択してください。

コードを最適化する 2 番目の方法は、少し難しいと考えられます。lua スクリプトの開始中に C プログラムを開始し、実行時に (並行して) 情報を交換して、呼び出すたびにプログラム全体を呼び出して表示する必要がないようにすることができます。

3 つ目の最も難しい方法は、C コードで n 個のスレッドを作成できるようにすることです。ここで、n<= プロセッサ ロジック コアは、独立して動作できるようにします。

また、気にしなくても、C/c++ コードは数学が得意ですが、Fortran、APL、Matlab、Haskel、R など、パフォーマンスを向上できるより優れた言語があります。数学的問題 - CPU の代わりに GPU を使用します -> シェーダー言語、私はそれらをいくつかの奇妙なものにも使用しました。グラフィックスに近くなくても、私にとってはうまくいきます。

于 2013-11-15T20:21:27.863 に答える