データの局所性を高めたい – プログラミング – Home

データの局所性を高めたい
 
通知
すべてクリア

[解決済] データの局所性を高めたい


ラジアン
 ラジアン
(@ラジアン)
ゲスト
結合: 22年前
投稿: 23
Topic starter  

リストでデータを管理したいと思っています。
しかし、リストはデータのアドレスがバラバラなので配列に比べて低速です。
なので部分的でもいいのでデータをまとめて配置したと考えています。
具体的には一度に複数のデータをリストに追加したい場合などです。
アドバイスお願いします。

開発環境はWin2000 VC++6.0Professional APIのみです。


引用未解決
トピックタグ
tetrapod
 tetrapod
(@tetrapod)
ゲスト
結合: 22年前
投稿: 830
 

> しかし、リストはデータのアドレスがバラバラなので配列に比べて低速です。
本当に遅いのでしょうか?
シーケンシャルアクセスする限り配列とリストで速度差は殆どありません。
データに対するランダムアクセスをしなければならないのであれば、
そもそもリスト構造を選択することが *設計上の誤り* です。

> 具体的には一度に複数のデータをリストに追加したい場合などです。
配列にデータを追加するよりリストにデータを追加するほうが、
一般的には遥かに高速です(時と場合により100倍以上速い)

何か勘違いをしていませんか?


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 23年前
投稿: 1301
 

局所性? 連続性ではなくて?

> 具体的には一度に複数のデータをリストに追加したい場合などです。
list< vector<X> > ではご不満でしょうか?


返信引用
ラジアン
 ラジアン
(@ラジアン)
ゲスト
結合: 22年前
投稿: 23
Topic starter  

MSDNにデータの局所性が低いとページフォールトが発生し、
パフォーマンスが低下するとの記述がありました。
自分でも確かめてみて(検索)、リストは配列に比べて低速でした。

STLはまだ使ったことが無いので解りません
これを機会に勉強してみようと思います


返信引用
tetrapod
 tetrapod
(@tetrapod)
ゲスト
結合: 22年前
投稿: 830
 

> MSDNにデータの局所性が低いとページフォールトが発生し、
> パフォーマンスが低下するとの記述がありました。
これは御意ですが
# でもこの「局所性」の意味は若干異なるような気がする

> 自分でも確かめてみて(検索)、リストは配列に比べて低速でした。
この速度低下の原因がページフォルトかどうかは検証していないのでしょう?

二分木検索のような検索はランダムアクセスが発生する典型例なので
リストが配列より遅いのは当然です。というか、そーいうのは設計が
不良なので、比較に意味がありません。

struct hoge_t {
int key;
char *text;
};
のような hoge_t の配列を text でソートするような場合は、配列を使っても
データの局所性は全くありません。ページフォルトが多発してもおかしくないです。


返信引用
ラジアン
 ラジアン
(@ラジアン)
ゲスト
結合: 22年前
投稿: 23
Topic starter  

すみません。「局所性」ではなく『連続性』を高めたいでした。

確かに、ただ遅かったという結果しか調べていません。


返信引用
ネアンデルタール
 ネアンデルタール
(@ネアンデルタール)
ゲスト
結合: 22年前
投稿: 3
 

処理速度を比較したリスト、配列は、自作のものですか?それともどこかのライブラリ
のものですか?(STLではないのですよね)
また、実際の比較結果は、どのくらいの数のデータをどのように追加しようとして、
どのくらいの時間がかかったのでしょうか。
そのような具体的なデータを教えて頂かないと、どのような解決法が適切なのか、分か
りかねます。


返信引用
ラジアン
 ラジアン
(@ラジアン)
ゲスト
結合: 22年前
投稿: 23
Topic starter  

自作です。 以下のコードで配列は約140ms、リストは約260msでした
データの追加では約33msかかっています

class A : public CListData<A>
{
public:
int a;
};

A* p;
A a[50000];

//リストに追加
for(i = 0; i < 50000; i++)
{
p = new A;
List.Insert(p);
}

//配列の要素全てをインクリメントするのを50回繰り返す
for(i = 0; i < 50; i++)
{
for(j = 0; j < 50000; j++)
a[j].a++;
}

//リストの全てのデータをインクリメントするのを50回繰り返す
for(i = 0; i < 50; i++)
{
p = List.GetFirst();
while(p)
{
p->a++;
p = p->GetNext();
}
}


返信引用
とおりすがり
 とおりすがり
(@とおりすがり)
ゲスト
結合: 23年前
投稿: 180
 

いや、だから、用途によるんだってば。
追加や削除じゃなくて、既にある全候補に処理するんなら、各候補にランダムにアクセスできる
配列の方が、次の候補をたぐらなくてはいけないリストより速いのは当然です。

でも、実際の使い方はいろいろあるでしょ?
・追加や削除が頻繁に発生する/しない
・その追加や削除も必ず一番後(or前)の要素が対象になる/任意の要素が対象になる
・頻繁にソートを行う/行わない
とか。
それぞれに応じて、配列、リストの利点、欠点があるわけで、用途に応じて適切なデータ構造
を選択する必要があります。
ちなみに、この手の話は一般的に「アルゴリズムとデータ構造」という非常に定番で基礎的な
テーマです。いくらでも記事や本が出ていますので、ネットなり本なりで、調べてみて下さい。


返信引用
joan
 joan
(@joan)
ゲスト
結合: 23年前
投稿: 42
 

> しかし、リストはデータのアドレスがバラバラなので配列に比べて低速です。
> なので部分的でもいいのでデータをまとめて配置したと考えています。

部分的に一度に追加する時だけ「配列」で追加する方法ばいいんじゃないですか?


返信引用
ラジアン
 ラジアン
(@ラジアン)
ゲスト
結合: 22年前
投稿: 23
Topic starter  

配列をリストで管理しようと思います。
これなら全てをリストで管理するよりいいと思うので。

どうもありがとうございました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました