├── README.md ├── pascal └── pascal.tcl ├── clock-scan └── bench.tcl ├── huddle └── bench.tcl └── math └── bench.tcl /README.md: -------------------------------------------------------------------------------- 1 | # simple tcl benchmarks 2 | 3 | ## clock-scan 4 | 5 | The clock-scan benchmark pounds on clock scan and clock format. 6 | 7 | ## huddle 8 | 9 | The huddle benchmark pounds on the tcllib huddle library to generate large geojson objects. 10 | 11 | ## math 12 | 13 | The math benchmark uses the haversine formula to calculate the great-circle distance between two points 14 | -------------------------------------------------------------------------------- /pascal/pascal.tcl: -------------------------------------------------------------------------------- 1 | # 2 | # tclsh pascal.tcl 3 | # 4 | # Generates N rows of Pascal's triangle. 5 | # 6 | 7 | proc pascal {{lastrow ""}} { 8 | set res 1 9 | foreach a [lrange $lastrow 1 end] b $lastrow { 10 | lappend res [expr $a+$b] 11 | } 12 | set res 13 | } 14 | 15 | set m [lindex $argv 0] 16 | set v [pascal] 17 | for {set ii 0} {$ii < $m} {incr ii} { 18 | puts $v 19 | set v [pascal $v] 20 | } 21 | -------------------------------------------------------------------------------- /clock-scan/bench.tcl: -------------------------------------------------------------------------------- 1 | 2 | 3 | proc clockscan {} { 4 | for {set year 1970} {$year < 2015} {incr year} { 5 | for {set month 1} {$month <= 12} {incr month} { 6 | for {set day 1} {$day <= 28} {incr day} { 7 | set result [clock scan "$month/$day/$year 00:00"] 8 | set fmty [clock format $result -gmt 1] 9 | #set result2 [clock scan $fmty] 10 | #lappend list $result $fmty $result2 11 | } 12 | } 13 | } 14 | } 15 | 16 | 17 | clockscan 18 | -------------------------------------------------------------------------------- /huddle/bench.tcl: -------------------------------------------------------------------------------- 1 | 2 | package require huddle 0.1.5 3 | 4 | # 5 | # load_array - quickly load up airport data into the airport array 6 | # 7 | proc load_array {} { 8 | set fp [open airports.array] 9 | array set ::airport [read $fp] 10 | close $fp 11 | } 12 | 13 | load_array 14 | 15 | # 16 | # huddle_school - generate geojson for the specified number of 17 | # airports (up to 30,000+) 18 | # 19 | proc huddle_school {howMany} { 20 | set airport_json [huddle list] 21 | 22 | foreach ap [lrange [array names ::airport] 0 $howMany] { 23 | lassign $::airport($ap) lat lon 24 | huddle append airport_json [huddle create type Feature geometry [huddle create type Point coordinates [huddle list $lat $lon]] properties [huddle create label $ap]] 25 | } 26 | 27 | set json [huddle jsondump [huddle create type FeatureCollection features $airport_json]] 28 | #puts $json 29 | } 30 | 31 | set howMany 10000 32 | 33 | puts [time "huddle_school $howMany" 5] 34 | 35 | -------------------------------------------------------------------------------- /math/bench.tcl: -------------------------------------------------------------------------------- 1 | # 2 | # simple tcl math benchmark 3 | # 4 | 5 | # for more on calculating distance, bearing, midpoint, etc, 6 | # see http://www.movable-type.co.uk/scripts/latlong.html 7 | 8 | # 9 | # degrees_radians - convert degrees to radians 10 | # 11 | proc degrees_radians {degrees} { 12 | return [expr {$degrees * 3.14159265358979323846 / 180.0}] 13 | } 14 | 15 | # 16 | # latlongs_to_distance - return the great circle distance 17 | # between two points 18 | # 19 | proc latlongs_to_distance {lat1 lon1 lat2 lon2} { 20 | set dLat [degrees_radians [expr {$lat2 - $lat1}]] 21 | set dLon [degrees_radians [expr {$lon2 - $lon1}]] 22 | 23 | set lat1 [degrees_radians $lat1] 24 | set lat2 [degrees_radians $lat2] 25 | 26 | set a [expr {sin($dLat / 2) ** 2 + sin ($dLon / 2) ** 2 * cos ($lat1) * cos ($lat2)}] 27 | set c [expr {2 * atan2 (sqrt ($a), sqrt (1 - $a))}] 28 | return [expr {3963. * $c}] 29 | } 30 | 31 | # 32 | # test - run the latlongs_to_distance calculation a bunch of times 33 | # 34 | proc test {} { 35 | for {set lon -180} {$lon < 180} {incr lon} { 36 | for {set lat -90} {$lat < 90} {incr lat} { 37 | for {set lon2 40} {$lon2 < 48} {incr lon2} { 38 | set d [latlongs_to_distance $lat $lon 44 $lon2] 39 | } 40 | } 41 | } 42 | } 43 | 44 | test 45 | --------------------------------------------------------------------------------