LV是数据流驱动的,这意味着通常LV 是采用值传递的。我们知道C 语言传递数据有两种方式,值传递和传递引用(指针)。如果C 函数参数采用值传递方式,会构造一个新的临时变量,函数内部对变量的修改不会影响到传入的变量,相当于自动创建了一个新的变量并完全复制传入变量的值。引用传递则完全不同,它传入的是外部变量的地址,因此在函数内部修改该变量,相当于直接修改外部变量。

      LV 数据流驱动采用值传递方式,这意味着但数据连线多分枝时,数据连线可以粗略理解成C 的变量,多分枝时则可能要创建多个同样值的临时变量。当然由于LV 采用了缓冲重用技术,多分枝连线时可能不需要对所有的分支创建新的“临时变量”。


如果我们传递一个大型的数据结构,比如一个大的数组,值传递的运行效率远低于引用传递。因为引用传递运行中只需要传递一个指针,几个字节和一个大型数组, 显然传递指针要高效的多。另外一个重要问题是数据共享的问题,当多个地方需要处理相同的共享数据时,采用值传递显然是不合适的。

LV2009新增了数据值引用函数,有效地解决数据引用传递问题。

首先看一下如何在LV 中实现共享数据,通常的做法是采用LV2 函数全局变量,我们创建一个动作机,分配一段内存空间并实现这段内存空间的读写功能
Picture
      在动作机的初始化动作中,我们创建了包含1000个元素的数组,并存入移位寄存器中。

动作机的读、写动作如下图所示:
Picture
Picture
      这样通过动作机,在LV2中封装包含1000个元素的双精度数组作为共享数据。具体调用方法如下图所示:

Picture
      上图模拟了多处多次调用共享数据的方法,运行时间约2954毫秒。如果是在一个循环中连续多次调用,使用移位寄存器可以实现共享数据的同地址操作,如下图所示:

Picture
      上图运行时间仅为58毫秒,速度远高于一般的值传递方式,上图中的方式仅适合在循环中多次调用的情形,对多处调用只能采用值传递方式。

     
在9.0以前,通过队列也可以实现引用传递,把数组放在队列中,队列本身传递的是引用,如下图所示:
Picture
      上图队列之包含一个元素,目的是保证多线程运行时,某一时刻只能有一个线程操作队列中的元素,避免了多线程中数据竞争的问题。从上图可以看出,通过引用操作大型数据,速度远高于数据流方式。

      下面采用LV 新增的数据值引用函数。

Picture
      采用新的引用方式传递数据,速度相当于直接采用移位寄存器,远高于普通的值传递方式。
Picture



Leave a Reply.