Qizhen's profileLabVIEWPhotosBlogListsMore ![]() | Help |
VI 中的数据空间 LabVIEW 由于比其它语言采用了更多的值传递方式,这必然会影响它的运行效率,也使得 LabVIEW 在这方面要采取一些其它语言不需要的应对措施,尽量提高效率。优化之一是子 VI 中局部变量使用的内存的分配方式。 LabVIEW 这种做法最大的好处是节约了大量开辟、回收内存的开销;但它也有个严重的缺陷,这也是其他语言不采用类似措施的原因:每次函数调用没有独立的数据区,因此无法实现递归调用(LabVIEW 静态调用的情况下)。经过权衡,LabVIEW 最终牺牲了递归来换取运行效率。 对于一般的子 VI(非可重入的),不论在程序的哪里被调用时,都使用的是同一块数据区。如果主 VI 上有两个并排被调用的同一个子 VI(如图1所示的两个 Delay VI),理论上的数据流驱动语言是应该在两个线程内同时运行两份子 VI 的代码。但是,由于这两次调用会使用到同一块数据区,为了避免两次运行之间互相干扰,引起数据混乱,LabVIEW 实际上是顺序执行这两次调用的。至于那部分代码被先调用是不确定的。
LabVIEW 只能顺序执行这两次调用,在很多时候并不是一件坏事。比如,子 VI 中的操作是读写某一串口。LabVIEW 的这一特性恰好防止了多线程同时对这个串口读写而引发的错误。但这种行为也会引起一些糟糕的问题。比如,子 VI 是用来读写所有串口的。我在一个线程内对串口1做了操作,另一个线程要对串口2操作。读写串口是比较慢的,本来应该两个串口同时操作,来节约一点时间。但是如果串口读写子VI不能重入,那其中一个线程就只好慢慢等着了。
相关文章: Comments (6)
TrackbacksThe trackback URL for this entry is: http://ruanqizhen.spaces.live.com/blog/cns!5852D4F797C53FB6!2225.trak Weblogs that reference this entry
|
|
|