【发布时间】:2023-02-10 23:53:41
【问题描述】:
使用 params、saved 和 session 声明可以处理多少数据? 这些声明如何影响性能和内存分配/消耗(堆栈使用、数据复制等)? 对于具有 10k-100k 元素的静态/动态数组,可以使用哪些方法?
【问题讨论】:
标签: dml-lang
使用 params、saved 和 session 声明可以处理多少数据? 这些声明如何影响性能和内存分配/消耗(堆栈使用、数据复制等)? 对于具有 10k-100k 元素的静态/动态数组,可以使用哪些方法?
【问题讨论】:
标签: dml-lang
无类型参数在任何时候被引用时都会像宏一样扩展,因此资源消耗取决于它的使用。如果你有一个包含大量数据的参数,那么通常意味着该值是一个包含很多元素的编译时列表([...]),你使用#foreach循环来处理它。 #foreach 循环总是展开,这会导致较长的编译时间和较大的生成代码。
如果在模板中键入参数,则该模板会评估一次参数并将副本存储在堆分配的内存中。数据在设备的所有实例之间共享。成本应该可以忽略不计。
数据是堆存储的,每个设备实例一个副本。
与数据非常相似,但为属性注册增加了一个大概可以忽略不计的小的每个模块成本。
还有两种数据变体:
header %{ const int data[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; %}
extern const int data;
创建一个超级便宜的模块本地实例。
independent startup memoized method data() -> (const int *) {
int *ret = new int[10];
for (local int i = 0; i < 10; i++) {
ret[i] = i;
}
return ret;
}
数据将在堆上分配,初始化一次,并在实例之间共享。初始化是通过代码完成的,如果很容易以编程方式表达数据,则可以节省大小,但如果它只是一个不规则数据表,则可能会很麻烦。
【讨论】: