構造体へのポインタを含むリンクされたリストについては、パフォーマンスとどのように「大きな」構造体があるとの何らかの関係があるのでしょうか?

scottc11:

反復/リスト内のオブジェクトにアクセスして、パフォーマンスに影響があるかどうか興味があるだけ。私は何の違いが、それでも好奇心はないだろうと仮定します。

例:

typedef struct BigStruct {
  int bigList[1000];
  AnotherStruct massiveStruct;
  struct BigStruct *next;
  int someValue;
  // and a bunch more variables etc.
} BigStruct;


BigStruct *temp;
temp = head;
while (temp) {
  // do some stuff
  temp = temp->next;
}

VS

typedef struct LittleStruct {
  int someValue;
  struct LittleStruct* next;
} LittleStruct;

LittleStruct *temp;
temp = head;
while (temp) {
  // do some stuff
  temp = temp->next;
}
supercat:

構造体は、それらのいくつかは、キャッシュラインに収まることを十分に小さいですし、割り当てが実際にお互いの意志の後にすぐにアクセスされた構造体が中に置かれる可能性が高いそれを作るような方法で行われている場合は、最高のパフォーマンスを達成することができます同じキャッシュライン。

構造体がキャッシュラインよりもはるかに大きい場合は、最高のパフォーマンスは、多くの場合、近くに連続してアクセスされる構造体の一部が互いに近くになることを確実にすることによって達成することができます。

以下の3つの構造を考慮してください。

struct s1 { struct s1 *next; int dat[1000]; int x,y; };
struct s2 { struct s1 *next; int x,y; int dat[1000]; };
struct s3 { struct s1 *next; int x,y; int *dat; };

次のループによってアクセスされるように:

while(p->x)
  p = p->next;

第二は一つだけを被るだろうが最初のループの中で最も反復のための2つのキャッシュミスを被るので、第二のパフォーマンスはおそらくはるかに良い最初のものよりもなります。小さいサイズは、構造が互いに近接して配置されることを可能にする場合は、上記ループを処理するときに、第三の性能がさらに良く秒よりかもしれない(おそらく反復ごと未満のキャッシュ・ミスの平均を招く)が、はるかに悪いより最初のいくつかの要素にアクセスする第二dat(キャッシュに構造をもたらすためには、また、最初のいくつかの要素にもたらすdat第二のフォームを使用する場合が、三分の一を使用しない場合)。

彼らは、「現実世界」の条件の下で行われていない限り、パフォーマンスのベンチマークはおそらく欺瞞することがあることに注意してください。それはそれとは思えないstruct s2よりも悪い実行することになりs1、最も現実世界の条件の下ではなく、間の相対的なパフォーマンスs2s3大幅に外側のコードが何をしているかの微妙な変化により影響を受ける可能性があります。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=29104&siteId=1