优化Hypermesh脚本性能的策略与建议

合理的使用变量作用域

  过程(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倍

免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删

QR Code
微信扫一扫,欢迎咨询~

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 155-2731-8020
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

手机不正确

公司不为空