summaryrefslogtreecommitdiffstats
path: root/tests-perf
diff options
context:
space:
mode:
authorsebres <sebres@users.sourceforge.net>2024-01-26 22:18:14 (GMT)
committersebres <sebres@users.sourceforge.net>2024-01-26 22:18:14 (GMT)
commitb7a1eb041b44a45583bfb65712826a9967cc147c (patch)
treefde2c3b016316aa924d7fb681e4365c873f6f907 /tests-perf
parentf50f3eca348c2e373a3e08e2a203bc9108f0fb29 (diff)
downloadtcl-b7a1eb041b44a45583bfb65712826a9967cc147c.zip
tcl-b7a1eb041b44a45583bfb65712826a9967cc147c.tar.gz
tcl-b7a1eb041b44a45583bfb65712826a9967cc147c.tar.bz2
added channel regression tests (for read command) to illustrate bugs [db4f2843cd], [da16d15574]
Diffstat (limited to 'tests-perf')
-rw-r--r--tests-perf/chan.perf.tcl93
1 files changed, 93 insertions, 0 deletions
diff --git a/tests-perf/chan.perf.tcl b/tests-perf/chan.perf.tcl
new file mode 100644
index 0000000..b3bd1c4
--- /dev/null
+++ b/tests-perf/chan.perf.tcl
@@ -0,0 +1,93 @@
+#!/usr/bin/tclsh
+
+# ------------------------------------------------------------------------
+#
+# chan.perf.tcl --
+#
+# This file provides performance tests for comparison of tcl-speed
+# of channel subsystem.
+#
+# ------------------------------------------------------------------------
+#
+# Copyright (c) 2024 Serg G. Brester (aka sebres)
+#
+# See the file "license.terms" for information on usage and redistribution
+# of this file.
+#
+
+
+if {![namespace exists ::tclTestPerf]} {
+ source [file join [file dirname [info script]] test-performance.tcl]
+}
+
+
+namespace eval ::tclTestPerf-Chan {
+
+namespace path {::tclTestPerf}
+
+proc _get_test_chan {{bufSize 4096}} {
+ lassign [chan pipe] ch wch;
+ fconfigure $ch -translation binary -encoding utf-8 -buffersize $bufSize -buffering full
+ fconfigure $wch -translation binary -encoding utf-8 -buffersize $bufSize -buffering full
+
+ exec [info nameofexecutable] -- $bufSize >@$wch << {
+ set bufSize [lindex $::argv end]
+ fconfigure stdout -translation binary -encoding utf-8 -buffersize $bufSize -buffering full
+ set buf [string repeat test 1000]; # 4K
+ # write ~ 10*1M + 10*2M + 10*10M + 1*20M:
+ set i 0; while {$i < int((10*1e6 + 10*2e6 + 10*10e6 + 1*20e6)/4e3)} {
+ #puts -nonewline stdout $i\t
+ puts stdout $buf
+ flush stdout
+ incr i
+ }
+ } &
+ close $wch
+ return $ch
+}
+
+# regression tests for [bug-da16d15574] (fix for [db4f2843cd]):
+proc test-read-regress {{reptime {50000 10}}} {
+ _test_run -no-result $reptime {
+ # with 4KB buffersize:
+ setup { set ch [::tclTestPerf-Chan::_get_test_chan 4096]; fconfigure $ch -buffersize }
+ # 10 * 1M:
+ {read $ch [expr {int(1e6)}]}
+ # 10 * 2M:
+ {read $ch [expr {int(2e6)}]}
+ # 10 * 10M:
+ {read $ch [expr {int(10e6)}]}
+ # 1 * 20M:
+ {read $ch; break}
+ cleanup { close $ch }
+
+ # with 1MB buffersize:
+ setup { set ch [::tclTestPerf-Chan::_get_test_chan 1048576]; fconfigure $ch -buffersize }
+ # 10 * 1M:
+ {read $ch [expr {int(1e6)}]}
+ # 10 * 2M:
+ {read $ch [expr {int(2e6)}]}
+ # 10 * 10M:
+ {read $ch [expr {int(10e6)}]}
+ # 1 * 20M:
+ {read $ch; break}
+ cleanup { close $ch }
+ }
+}
+
+proc test {{reptime 1000}} {
+ test-read-regress
+
+ puts \n**OK**
+}
+
+}; # end of ::tclTestPerf-Chan
+
+# ------------------------------------------------------------------------
+
+# if calling direct:
+if {[info exists ::argv0] && [file tail $::argv0] eq [file tail [info script]]} {
+ array set in {-time 500}
+ array set in $argv
+ ::tclTestPerf-Chan::test $in(-time)
+}