|
|
很多Flexsim企业客户在运行大模型时希望可以更快一些得到仿真运行结果,关于这一点的讨论我们原帖引自Flexsim官方论坛,原帖地址:http://www.flexsim.com/community/forum/showthread.php?t=460
4 [6 u! |) }. f, u. z( d9 x: E+ U* e
【以下是我们翻译过来的内容】2 Y4 g/ X4 R+ A
Alex Christensen运行一个大型的模型往往需要花费大量的时间,你的处理器以最快速度在运行模型的时候,单纯将运行速度调到一个较高的值并不会提高模型的实际运行速度。当你想要从模型中获取准确数据且不在意模型的可视化效果或可编辑性时,有如下几种方法可以增加运行速度。
* d4 F* {+ a$ Z. L- x: ]& M+ l% [% q3 X; g7 k: R
1) 如果一条代码需要重复运行而你又不需要频繁的编辑时,选择代码编写窗口下面的C++选项,将其编译成C++的代码。
! Z% h0 s5 l) T* }. k. B2) 如果模型已经建立完毕,只是需要它快速运行,可以在主菜单中将所有的代码转换为C++。虽然你每次要修改模型中的任何部分都需要重新编译一次,但这样会使运行速度更快。0 y2 h/ F& P6 d6 U, s
3) 如果你经常设定或引用标签,可以使用标签的索引值进行引用,而不使用标签的名字。比如,如果临时实体的第一个标签是“creationtime”,代码编写中用setlabelnum(item,1,time()); 而不是setlabelnum(item,”creationtime”,time());1 t y# M4 F% W2 R' U
4) 表格的使用通常也可以优化。设置并使用指针来访问表格,而不使用表格名或者在数中的排序序号。* r% W/ L$ b4 c. C0 z. U* X
5) 在运行模型时,将所有的视图都关闭(不是最小化)。这将避免为读取绘图代码而降低模型运行速度。
* ^: z5 X, u W/ K/ n% \
) j: y5 S( `( _以上建议将会降低代码的可读性和编辑性,因此除非你的模型不会再进行大量的修改否则请不要进行这些优化方式。建议您将以上的内容保存下来以备不时之需。2 t1 q# k: k) H1 v; u3 w
4 o1 z7 _/ D* P0 ~" e: y
Brandon Peterson回复
9 i6 ~6 w" ~; b& z; K( I+ i, F在模型中使用C++代码的另一种方法是:将C++代码放到一个DLL文件中,然后在模型中载入这个DLL文件。这是个更复杂的操作,但是可以避免后期的编译。4 E2 L9 `( f" j' `
) B% F5 `2 K* e d. b ?+ r/ g9 F) _Sung Kim回复A. J和 Anthony也建议我尝试使用 "recycling flowitem"功能 (但是我还不太熟悉这块 )。, }7 l5 M" m7 j- @6 L1 g5 l
, ]& O: Q1 Q y分享一些我从A.J.和Anthony那里学到的其它一些小技巧* i& I W& D$ }: h& v
3)关于标签的索引,为每个实体的标签定义全局宏索引,这样的使用方式更具描述性。
" @# j6 n* ~! l0 H/ P& [5)他们建议我不仅仅关闭透视视图和俯视视图,也要关闭输出视图(避免打印文本信息)和树视图窗口(我猜尽量将所有的无用的窗口都关闭)1 d$ T$ r1 B; P5 X/ i7 l# z, X
: v6 A3 v- ?% _% e
Dustin Derrick回复3 Q) I, n( s, k1 i
以下是我在提高运行速度时的一些小建议
" E, U% C& c) A6 h9 ]( Z2 B1 A/ \% s1 \提问:如何使模型运行速度更快?
6 y7 ^4 R- [- N& f, _回答:减少计算机必须执行的进程数量! w; ?0 j# c( X9 U% f
% I4 N# p8 Y3 U$ H- \1 X# Y/ R关键在于找到模型运行过程中隐藏在所有活动后面的进程数量
% f- y3 j* ?) Q
3 L4 T. |9 i/ b" s$ w z" v首先,我会提一些有关图形显示时间的建议。只有当打开一个或多个视图窗口的时候(俯视视图和透视视图窗口),实体才执行图形绘制事件。这些绘制事件起到动态显示实体的作用,在视图窗口每次更新(每秒30次)时都执行。比如:传送带上的临时实体流动、叉车在路线运行,处理器、货架的列和层等几何图形等都是在这些绘制事件中定义的。较好的计算机显卡将会确保3维视图的显示、动画和导航更加柔和,当关闭视图窗口的时候,就不会再执行这些绘制事件了。因此,如果你想要模型运行更快,就关闭你的透视显示。
9 W& y/ R; v1 I9 C3 X. T* p: t5 c$ c, ]/ c$ f g& ^' w1 P
以下是需要记住的关键几个点(排名不分先后)/ U6 t; k3 y# N! L
1. 创建一个临时实体比移动临时实体要慢,因此不要摧毁这些临时实体,应该将他们移动到一个临时暂存区以备后期使用。我们将其称作循环使用的临时实体。这将是下一个版本中发生器和吸收器的理想结构,当前版本中需要我们自行完成。
0 U+ B0 d7 Z/ M3 Z: P2. 建议1同样适用于标准节点。如果你为了一些动态数据存储或其他需要而创建你自己的节点,尽量循环使用而不是摧毁重建。, z9 e( U- K% _. }
5 e) f) K; A9 z; h8 C3. 减少模型中的事件数量。尽量不使用“消息循环”、监视列表或flexsim中的监听功能来被动完成逻辑检查。而实在模型发生变化需要进行检查时,主动执行检查操作。0 n8 G* c& k8 l9 j4 u
4. 避免在大容量的暂存区中对临时实体进行排序。. |3 k& X: O: y, o1 W
5. 避免同时创建太多的待定事件(如senddelaymessage)。如果创建事件时,已经有很多的事件在排队,那么要计算新事件的位置,并重新排序需要耗费很多时间。
; c" r$ I: K9 f' f: l! V6. 作为临时存放临时实体的暂存区应该关闭其容量的显示,把临时实体的放置方式设定为“无操作”
! M7 n( Z, Y! e8 n v7. 引用全局表、标签和其它对象时,通常使用指针而不是名字。以标签为例,引用索引比名字快,而引用指针是最快的。% i- Y) R. z! P: e+ [
8. 使用数值标签而不使用字符串标签。2 b$ H) S9 E3 e# {% ?8 E0 d J: ]
9. 在条件语句中总是选择数值比较而不是字符比较。( l0 l v' J1 y
10. 在表中尽量直接引用行而不采用搜索和查找算法。3 h6 M' R# M S( p! u
11. 通过更新表格来统计模型中的库存,而不使用真实的临时实体来表现存货。比如货架的存货用标签表中的数字而不是临时实体来显示。当临时实体进入货架,仅仅是更新了表中的数据,同时将临时实体移动到临时暂存区以供模型中循环使用。(下个版本中将会有好的命令来实现以上这些工作)+ a2 ?8 t8 E, X0 m
12. 设置可以被多次使用的全局函数,而不在每次函数运行时重新定义指针。: q3 g1 R" I2 k1 X1 Q% z
13. 避免使用node()命令。8 _! i1 X) C3 @
14. 尽量直接编写执行代码,而不是通过nodefunction 或sendmessage执行其它地方的代码。
( b% v! \3 M* x E, X: C, q
, S4 M9 p0 R; P% `15. C++比flexscript(flexsim内置语言)运行更快,而先建的flexscript比没有先建的flexscript更快。换言之,则是nodefunction()比executefanode()更快。- I. F9 ? h' ] n
16. 在函数中,当你发现你需要多次引用相同的节点或者实体时,可创建本地指针。2 B) W8 B; _( n8 ]4 _- u# S
17. 通过(ODBC)读取数据时,在改变行之前一次性读取一整行(或记录)。
% |( F+ O: j: z+ ~5 j& x( f18. 通过ODBC,DDE,OLE动态读取或写入数据要比直接从Flexsim全局表中读写数据要慢6 [) X/ g3 z" A! A z% F
19. 在开发自己的实体时(例如,通过BasicTE和BasicFR),使用OnUpdateOffset和定制绘制代码字段来定义所有你的动态动作,而不是使用消息字段的消息循环。当你关闭视图时,OnUpdateOffset和定制绘制代码字段不会进行分析,将会使得你的模型运行得更快。 |
评分
-
查看全部评分
|