私は2Dビンパッキングアルゴリズムを研究しています。私はPHPの性能に関してsimilar questionに質問しました。パックするのが遅すぎました。そして、コードはC++に変換されました。C++のパフォーマンス:特定のセルに特定の値を持つメモリブロックをチェックする
まだかなり遅いです。どのような私のプログラムが行うことは、結果として動的メモリのブロックを割り当てると「O」の文字でそれらを移入され
char* bin;
bin = new (nothrow) char[area];
if (bin == 0) {
cout << "Error: " << area << " bytes could not be allocated";
return false;
}
for (int i=0; i<area; i++) {
bin[i]='o';
}
の
次に、プログラムチェックの異なる組み合わせ(その大きさは、私のデータセットの1キロバイトと30キロバイトの間にあります)現在のメモリブロックの中の 'x'文字。
void place(char* bin, int* best, int width)
{
for (int i=best[0]; i<best[0]+best[1]; i++)
for (int j=best[2]; j<best[2]+best[3]; j++)
bin[i*width+j] = 'x';
}
非重複をチェックする関数の1つは、実行時に何百万回も呼び出されます。
bool fits(char* bin, int* pos, int width)
{
for (int i=pos[0]; i<pos[0]+pos[1]; i++)
for (int j=pos[2]; j<pos[2]+pos[3]; j++)
if (bin[i*width+j] == 'x')
return false;
return true;
}
他のすべてのものは、実行時の唯一のパーセントを取るので、私はこれらの2人の男(フィットと場所)より速くを作成する必要があります。犯人は誰ですか?
私は2つのオプション 'x'と 'o'しか持っていないので、charがとるバイト全体の代わりにちょうど1ビットを使うことができます。しかし、私はスピードにもっと関心があります、あなたはそれが物事をより速くすると思いますか?
ありがとうございます!
更新:int* pos
をrect pos
(best
と同じ)に置き換えました。これは推奨されるMSalterのとおりです。最初は改善が見られましたが、より大きなデータセットでさらにテストしました。通常のランタイムに戻っているようです。他のテクニックを試してみましょう。
更新:memset
とmemchr
を使用して約2回スピードアップしました。 'x'と 'o'を '\ 1'と '\ 0'に置き換えても改善は見られませんでした。 __restrict
も役に立たなかった。全体的に、私はアルゴリズム自体にいくつかの改良を加えたので、プログラムのパフォーマンスに満足しています。私はまだビットマップを使って-02(-03)でコンパイルしようとしています...もう一度皆さんに感謝します。
地域の幅と高さはどれくらいですか?あなたは通常どのくらいのブロックを置く必要がありますか? –
これはおそらくパフォーマンスにはあまり影響しませんが、とにかく試してみる価値があります: 'best'と' pos'の型を 'const int *'に変更して、コンパイラは 'best [0 ] + best [1] 'を返します。しかし、これが改善であっても、それは非常に軽微です。 –
'best'が' const int * 'ならば、' best [0] 'は**' best'を通して変更できません。 'bin'は' best'のエイリアスになるので、bin [i * width + j] = 'x''が 'best [0]'に変わる可能性があります。コンパイラは毎回式を再評価する必要があります。手動ホイストがこれを修正します。 – MSalters