1

idx という int フィールドを持つ構造体があるとします。この構造体のリストがあり、このリストにないインデックスを生成する必要があります。最も直接的なキープは次のようになります。};

問題は、mylist が長い場合、mylist.idx が大きなリストを返すことです。私はやりたかったでしょう: gen idx keep { not mylist.has(it.idx == it); };

より良いメモリパフォーマンスでこれを行う他の方法はありますか?

4

1 に答える 1

3

実際、list.field が新しいリストを返し、それを繰り返し行うと、大量のメモリが割り当てられる可能性があります。

少し痛みを和らげる 1 つの方法は、補助リストを使用して、「mylist.idx」の使用と新しいリストの割り当てを回避することです。

このように、元のコードが

<'  
struct A {
  idx:int;  
};
extend sys  {
    run() is also  {
        var mylist: list of A;
        var idx:int;
        for i from 0 to 10000 {
            gen idx keeping {it not in mylist.idx};
            mylist.add(new A with {.idx = idx;});
        };
    };
};
'>

ピーク プロセス サイズ: 969MB

補助リストを追加できます:

<'
struct A {
  idx:int;  
};
extend sys  {
    run() is also  {
        var mylist: list of A;
        var l : list of int;
        var idx:int;
        for i from 0 to 10000 {
            gen idx keeping {it not in l};
            mylist.add(new A with {.idx = idx;});
            l.add(idx);
        };
    };
};
'>

ピーク プロセス サイズ: 736MB

ただし、Specman 12.2 以降では、補助変数で「set」型を使用できるようになり、生成がより効果的になりました。

<'
struct A {
  idx:int;  
};
extend sys  {
    run() is also  {
        var mylist: list of A;
        var S:set;
        var idx:int;
        for i from 0 to 10000 {
            gen idx keeping {it not in value(S)};
            mylist.add(new A with {.idx = idx;});
            S = S.union([idx]);
        };
    };
};
'>

ピーク プロセス サイズ: 135MB

于 2014-05-20T09:20:23.697 に答える