idx という int フィールドを持つ構造体があるとします。この構造体のリストがあり、このリストにないインデックスを生成する必要があります。最も直接的なキープは次のようになります。};
問題は、mylist が長い場合、mylist.idx が大きなリストを返すことです。私はやりたかったでしょう: gen idx keep { not mylist.has(it.idx == it); };
より良いメモリパフォーマンスでこれを行う他の方法はありますか?
idx という int フィールドを持つ構造体があるとします。この構造体のリストがあり、このリストにないインデックスを生成する必要があります。最も直接的なキープは次のようになります。};
問題は、mylist が長い場合、mylist.idx が大きなリストを返すことです。私はやりたかったでしょう: gen idx keep { not mylist.has(it.idx == it); };
より良いメモリパフォーマンスでこれを行う他の方法はありますか?
実際、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