相对而言,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等语言击败。 有很多原因,其中有一些是这样的:
fconfigure
用它(如果使用fconfigure
) 那么如何让你的代码快速(呃)?
.*
模式对性能不利。 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?