相对而言,Windows 10上的TCL应该多快?

我拥有安装在运行Windows 10的台式机和笔记本电脑上的Active State的最新TCL版本。我是TCL和新手开发人员的新手,我学习TCL的理由是为了增强我在F5平台上的价值。 我认为一个好的第一步就是停止我在VBScript中做的偶尔工作,并将其移植到TCL。 学习语言本身就会好起来,但我担心我的项目由于性能而不可行。 我的VBScripts在性能上完全摧毁了我的TCL脚本。 我并没有期待这个结果,因为我的理解是TCL是如此“快速”,这就是为什么它被F5选为iRules等等。

所以问题是,我做错了什么? Windows的端口不是那里吗? 也许我误解了TCL速度快的方式,并且文件解析应用程序的速度并不快。

我的测试应用程序是一个防火墙日志解析器。 记录600万次点击并找到唯一的src / dst / port / policy条目并对它们进行计数; 分成接受和否认。 打开文件并读取行很好,TCL处理18k行/秒,而VBScript执行11k。 只要我对数据做任何事情,潮流就会转变。 我需要打破上面提到的四行数据读取和放入数组。 我已经“分裂”了这条线,做了一个for-next来阅读并匹配这一行的每一部分,这是最慢的。 我做了一个带有子变量的正则表达式,它可以在一行中提取所有四个元素,而且速度要快得多,但速度比使用一个变量执行四个正则表达式慢两倍,然后使用修剪从匹配中清除多余数据。 但是即使这种方法比使用临时分割/用于下一个匹配和修剪的VBScript慢四倍。 在我的桌面上,我用TCL获得7k线/秒,用VBscript获得25k线。

然后是数组,我假设,因为我的3维数组不是一个真正的数组,通过3倍的搜索,尽可能多的线正在减慢它。 我可能会尝试分解这个数组,因此它正在查看当前的三分之一数据。 但事实是,在脚本达到阵列中有几百个条目的时候,它会从处理7k行/秒降到小于2k。 我的VBScript从大约25k线下降到22k线。 所以我没有看到太多的希望。

我想我在寻找答案,对于那些具有TCL经验和一般编程经验的人来说,TCL本身比VB和其他脚本要慢得多,我正在做什么? 它是Windows的端口,它放慢了速度? 什么样的应用程序是TCL“快”还是擅长? 如果我需要尝试一种不同于从文件中读取和处理数据的项目,我会对此表示赞同。

根据要求编辑以添加代码示例:

while { [gets $infile line] >= 0 } {

我为了空间而剪掉的其他一些命令,它们不会造成缓慢

regexp {srcip=(.*)srcport.*dstip=(.*)dstport=(.*)dstint.*policyid=(.*)dstcount} $line -> srcip dstip dstport policyid

上述意想不到地缓慢。 禁食的方式来提取我迄今为止发现的数据

regexp {srcip=(.*)srcport} $line srcip
set srcip [string trim $srcip "cdiloprsty="] 
regexp {dstip=(.*)dstport} $line dstip
set dstip [string trim $dstip "cdiloprsty="] 
regexp {dstport=(.*)dstint} $line dstport
set dstport [string trim $dstport "cdiloprsty="]
regexp {policyid=(.*)dstcount} $line a policyid
set policyid [string trim $policyid "cdiloprsty="]

以下是一段时间后真正陷入困境的数组搜索:

set start [array startsearch uList]
while {[array anymore uList $start]} {
    incr f
    #"key" returns the NAME of the association and uList(key) the VALUE associated with name
    set key [array nextelement uList $start]
    if  {$uCheck == $uList($key)} {
        ##puts "$key CONDITOIN MET"

        set flag true
        adduList $uCheck $key $flag2
        set flag2 false
        break
    }
}

您的问题范围仍然有限。

F5发表了一些评论,他们为什么选择Tcl以及它们对于特定用途的速度如何。 这实际上与日志解析用例有点不同,因为他们在C代码中完成所有繁重的工作(通过自定义命令),并且主要使用Tcl作为快速调度器和一些流量控制。 与其他各种语言相比,Tcl非常擅长。

对于像日志解析这样的事情,Tcl在简单的基准测试中经常被Python和Perl等语言击败。 有很多原因,其中有一些是这样的:

  • Tcl使用不同的正则表达式样式(DFA),对于讨厌的模式更加健壮,但对于简单模式更慢。
  • Tcl具有比Python更抽象的I / O层,并且通常会将输入转换为unicode,如果您fconfigure用它(如果使用fconfigure
  • Tcl具有适当的多线程,而不是全局锁,其单线程用例的性能约为10-20%。
  • 那么如何让你的代码快速(呃)?

  • 尝试更具体的正则表达式,那些贪婪的.*模式对性能不利。
  • 尝试使用string命令而不是regexp, string range后面的一些string first命令可能比这些简单模式的正则表达式更快。
  • 为该数组使用不同的结构,您可能需要一个dict或某种形式的嵌套list
  • 把你的代码放到一个proc ,不要把它全部放在顶层脚本中,而要使用局部变量而不是全局变量来使字节码更快。
  • 如果你愿意,使用一个线程从文件和多线程中读取行来提取数据,就像典型的生产者 - 消费者模式一样。

    链接地址: http://www.djcxy.com/p/67743.html

    上一篇: In relative terms, how fast should TCL on Windows 10 be?

    下一篇: Loading icon from kit using twapi