优化Hypermesh脚本性能的几点建议

  以下给出几种优化Hypermesh二次开发tcl脚本的性能的方法。

注意:下面列出的时间是在一台奔腾266mhz的计算机上使用10000次迭代的Tcl命令运行时间。


合理的使用变量作用域

  过程(proc)中定义的变量默认为局部变量。有许多方法可以访问过程作用范围之外的变量,包括使用命令global,upvar,uplevel和使用全局命名空间引用符::

命令时间消耗
uplevel 含level每次迭代花费66微秒
uplevel每次迭代花费55微秒
upvar每次迭代花费55微秒
global每次迭代花费60微秒
全局命名空间引用符::每次迭代花费55微秒
局部变量每次迭代花费39微秒

整数变量加减

在整数加/减时,从变量中加上或减去一个值时,请使用incr命令,而不要使用expr调用。

命令时间消耗
expr每次迭代花费55微秒
incr:每次迭代花费11微秒
相差5.0倍

括号表达式调用

使用expr命令时,用**大括号{}**将表达式括起来,以利用字节码编译的优势。

方法时间消耗
不使用大括号每次迭代花费143微秒
使用大括号每次迭代花费55微秒
相差2.60倍

proc返回值

尽可能避免在过程(proc)中使用return函数。将变量设置为要返回的值,然后在过程底部(最后一行)调用set varname会更有效。

命令时间消耗
return每次迭代花费39微秒
set每次迭代花费5微秒
相差7.80倍

列表解析

解析列表的内容时,最快的方法是使用foreach命令。其次是使用带有递减索引测试的while循环,而效率最低的方法是使用for循环。

命令时间消耗
for每次迭代花费159微秒
while每次迭代花费115微秒
foreach每次迭代花费66微秒

全局变量初始化

初始化全局变量时,请将它们放在过程(proc)中,然后在全局命名空间中访问它们以利用字节码编译的优势。

命令时间消耗
内联(inline)初始化花费110000毫秒
proc中初始化花费50000毫秒

数组与列表

对于大型列表搜索,使用数组可能更有效。列表搜索是顺序搜索,对于大型列表可能不是很有效。不用将项目添加到列表中,而是将数组的索引设置为项目名称。

  • 使用列表
set a "1 2 3 4 5 6 7 8 9 0";
if {[lsearch $a 9] != -1} {
   …command body…
}
  • 使用数组
set a(1) 1;
set a(2) 2;
…
set a(9) 9;
set a(0) 0;

if {[info exist a(9)] == 1} {
   …command body…
}

对于排序列表,根据列表类型,使用-sorted选项以及-ascii,-decreasing,-dictionary,-inreasing,-integer-real等参数可能更有效。

实例

以下示例显示了对全局列表中的数字的求和过程,并结合了上面讨论的一些性能优化方法。

set vals {10 20 30 40 50 60 70 80 90};

proc sum {} {
   global vals;
   set sum 0;
   for { set i 0 } { $i < [ llength $vals ] } { incr i } {
      set curVal [ lindex $vals $i ];
      set sum [ expr $sum + $curVal ];
   }
   return $sum;
}

proc fasterSum {} {    
   set sum 0;
   foreach val $::vals {
      incr sum $val;
   }
   set sum;
}

sum过程函数花费: 829ms

fasterSum过程函数花费: 83ms

两者相差: 9.99倍


  扫描下方二维码关注我的微信公众号 - CAE软件二次开发Lab,查看更多精彩文章!

关注微信公众号
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值