假设我们有一个结构,其中有一个名为idx的int字段。 我有一个这个结构的列表,我需要生成一个不在此列表中的索引。 最直接的保持是: gen idx keep { 它不在mylist.idx中; };
问题是如果mylist很长,那么mylist.idx会返回一个大列表。 我本来希望这样做: gen idx keep { 不是mylist.has(it.idx == it); };
还有其他方法可以做到这一点,具有更好的内存性能吗?
答案 0 :(得分:3)
确实,当list.field返回一个新列表时,重复执行此操作时,可以分配大量内存。
缓解疼痛的一种方法是使用辅助列表来避免使用“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