【问题标题】:Limitations of params, saved and session DML declarationsparams、saved 和 session DML 声明的限制
【发布时间】:2023-02-10 23:53:41
【问题描述】:

使用 params、saved 和 session 声明可以处理多少数据? 这些声明如何影响性能和内存分配/消耗(堆栈使用、数据复制等)? 对于具有 10k-100k 元素的静态/动态数组,可以使用哪些方法?

【问题讨论】:

    标签: dml-lang


    【解决方案1】:

    参数

    无类型参数在任何时候被引用时都会像宏一样扩展,因此资源消耗取决于它的使用。如果你有一个包含大量数据的参数,那么通常意味着该值是一个包含很多元素的编译时列表([...]),你使用#foreach循环来处理它。 #foreach 循环总是展开,这会导致较长的编译时间和较大的生成代码。

    如果在模板中键入参数,则该模板会评估一次参数并将副本存储在堆分配的内存中。数据在设备的所有实例之间共享。成本应该可以忽略不计。

    会议

    数据是堆存储的,每个设备实例一个副本。

    已保存

    与数据非常相似,但为属性注册增加了一个大概可以忽略不计的小的每个模块成本。

    还有两种数据变体:

    常数 C 表

    header %{ const int data[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; %}
    extern const int data;
    

    创建一个超级便宜的模块本地实例。

    独立启动memoized方法

    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;
    }
    

    数据将在堆上分配,初始化一次,并在实例之间共享。初始化是通过代码完成的,如果很容易以编程方式表达数据,则可以节省大小,但如果它只是一个不规则数据表,则可能会很麻烦。

    【讨论】:

      猜你喜欢
      • 2018-12-14
      • 2013-08-29
      • 2014-12-21
      • 2016-06-06
      • 1970-01-01
      • 1970-01-01
      • 2015-08-19
      • 2023-03-05
      • 1970-01-01
      相关资源
      最近更新 更多