summaryrefslogtreecommitdiff
path: root/ipl/procs/ibench.icn
diff options
context:
space:
mode:
Diffstat (limited to 'ipl/procs/ibench.icn')
-rw-r--r--ipl/procs/ibench.icn171
1 files changed, 171 insertions, 0 deletions
diff --git a/ipl/procs/ibench.icn b/ipl/procs/ibench.icn
new file mode 100644
index 0000000..ae47370
--- /dev/null
+++ b/ipl/procs/ibench.icn
@@ -0,0 +1,171 @@
+############################################################################
+#
+# File: ibench.icn
+#
+# Subject: Procedures to support Icon benchmarking
+#
+# Author: Ralph E. Griswold
+#
+# Date: March 23, 2002
+#
+############################################################################
+#
+# This file is in the public domain.
+#
+############################################################################
+#
+# Procedures to support benchmarking of Icon programs:
+#
+# Init__(prog) initialize for benchmarking
+# Term__() terminate benchmarking
+# Allocated__() get amounts allocated
+# Collections__() get collections
+# Regions__() get regions
+# Signature__() show program/environment information
+# Storage__() get storage
+# Time__() show elapsed time
+# Display__(data,name) show information
+#
+############################################################################
+#
+# The code to be timed is bracketed by calls to Init__(name)
+# and Term__(), where name is used for tagging the results.
+# The typical usage is:
+#
+# procedure main()
+# [declarations]
+# Init__(name)
+# .
+# .
+# .
+# Term__()
+# end
+#
+# If the environment variable OUTPUT is set, program output is
+# not suppressed.
+#
+# If the environment variable NOBENCH is set, benchmarking is not
+# performed (and OUTPUT has no effect). This allows a program that
+# links ibench to run in the ordinary way.
+#
+############################################################################
+
+global Save__, Saves__, Name__, Labels__
+
+# List information before running.
+#
+procedure Init__(prog)
+ if getenv("NOBENCH") then { # don't do benchmarking
+ Term__ := 1
+ return
+ }
+ Name__ := prog # program name
+ Labels__ := ["total ","static","string","block "]
+ write(Name__,": benchmarking\n")
+ Signature__() # initial information
+ Regions__()
+ Time__()
+ if not getenv("OUTPUT") then { # if OUTPUT is set, allow output
+ Save__ := write # turn off output
+ Saves__ := writes
+ write := writes := -1
+ }
+ else write(Name__,": output\n")
+ return
+end
+
+# List information at termination.
+
+procedure Term__()
+ if not getenv("OUTPUT") then { # if OUTPUT is not set, restore output
+ write := Save__
+ writes := Saves__
+ }
+ # final information
+ Regions__()
+ Storage__()
+ Collections__()
+ Allocated__()
+ write("\n",Name__,": elapsed time = ",Time__()," ms.")
+ return
+end
+
+#
+# List total amounts of allocation. Needs Icon Version 8.5 or above.
+#
+procedure Allocated__()
+ local allocated
+
+ allocated := []
+ every put(allocated,&allocated)
+ Display__(allocated,"allocated")
+ return
+
+end
+
+# List garbage collections performed.
+#
+procedure Collections__()
+ local collections
+
+ collections := []
+ every put(collections,&collections)
+ Display__(collections,"collections")
+ return
+end
+
+# List region sizes.
+#
+procedure Regions__()
+ local regions, count
+
+ regions := []
+ every put(regions,&regions)
+ count := 0
+ every count +:= !regions
+ push(regions,count)
+ Display__(regions,"regions")
+ return
+end
+
+# List relveant implementation information
+#
+procedure Signature__()
+
+ every write(&version | &host | &features)
+ return
+
+end
+
+# List storage used.
+#
+procedure Storage__()
+ local storage, count
+
+ storage := []
+ every put(storage,&storage)
+ count := 0
+ every count +:= !storage
+ push(storage,count)
+ Display__(storage,"storage")
+ return
+end
+
+# List elapsed time.
+#
+procedure Time__()
+ static lasttime
+
+ initial lasttime := &time
+ return &time - lasttime
+end
+
+# Display storage information
+#
+procedure Display__(data,name)
+ local i
+
+ write("\n",name,":\n")
+ every i := 1 to *Labels__ do
+ write(Labels__[i],right(data[i],8))
+end