爲了比較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]'? –