为了比较Agda programming language与Tcl脚本语言的速度,我正在执行一个小小的速度测试。它的科学工作,这只是一个预测试,而不是一个真正的考验。无论如何,我都没有尝试进行实际的速度比较!解析整数列表(速度测试所需的优化)
我想出了一个小例子,其中Agda比Tcl快10倍。我使用这个例子有特殊的原因。我主要担心的是我的Tcl代码编程糟糕,这是Tcl在这个例子中比Agda慢的唯一原因。
代码的目标是解析表示整数列表的行,并检查它是否确实是一个整数列表。
示例“(1,2,3)
”将是一个有效的列表。
示例“(1,a,3)
”不是有效的列表。
我的输入是一个文件,我检查文件的每第三行(第三行)。如果任何行不是整数列表,程序将打印“false
”。
我的输入文件:
(613424,505980,317647,870930,75580,897160,716297,668539,689646,196362,533020)
(727375,472272,22435,869407,320468,80779,302881,240382,196077,635360,568517)
(613424,505980,317647,870930,75580,897160,716297,668539,689646,196362,533020)
(但是,我真正的考验文件大约3兆字节大)
我目前TCL代码来解决这个问题:
package require Tcl 8.6
proc checkListNat {str} {
set list [split [string map {"(" "" ")" ""} $str] ","]
foreach l $list {
if {[string is integer $l] == 0} {
return 0
}
}
return 1
}
set i 1
set fp [open "/tmp/test.txt" r]
while { [gets $fp data] >= 0 } {
incr i
if { [expr $i % 3] == 0} {
if { [checkListNat $data] == 0 } {
puts "error"
}
}
}
close $fp
如何我可以优化当前的Tcl代码,以便Agda和Tcl之间的速度测试更加真实吗?
我会使用'字符串范围$ str 1 end-1'而不是字符串映射。另外,'if'条件已经是一个表达式,所以你只需要'if {$ i%3 == 0}'而不用调用expr。 –
@glenn请注意'expr'是无支撑的... –
嗨@唐纳,我不明白你的评论。这不等于'[expr [expr $ i%3] == 0]'? –