From 6d97bcc6db2d112b538fb0e82b386f6c3664dcd0 Mon Sep 17 00:00:00 2001 From: raj_mathe Date: Tue, 2 Nov 2021 13:05:34 +0100 Subject: [PATCH] =?UTF-8?q?master=20>=20master:=20code=20go,=20py=20-=20An?= =?UTF-8?q?zeige=20von=20Metriken=20vereinheitlicht;=20start/stop=20unmitt?= =?UTF-8?q?elbar=20um=20Ausf=C3=BChrung=20des=20Algorithmus?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../algorithms/search/binary/binary_fancy.go | 6 ++-- .../search/interpol/interpol_fancy.go | 6 ++-- .../search/ith_element/ith_element_fancy.go | 12 +++---- .../algorithms/search/jump/jump_fancy.go | 12 +++---- .../algorithms/search/poison/poison_fancy.go | 12 +++---- .../search/sequential/sequential_fancy.go | 6 ++-- .../sum/maxsubsum/maxsubsum_fancy.go | 12 +++---- code/golang/internal/core/metrics/metrics.go | 32 +++++++++++++++++-- code/golang/internal/setup/setup_display.go | 3 +- code/golang/internal/types/types_timer.go | 16 +++++++--- code/python/src/algorithms/methods.py | 8 +++-- code/python/src/core/metrics.py | 25 +++++++++++---- 12 files changed, 100 insertions(+), 50 deletions(-) diff --git a/code/golang/internal/algorithms/search/binary/binary_fancy.go b/code/golang/internal/algorithms/search/binary/binary_fancy.go index 65e18b9..b0f5080 100644 --- a/code/golang/internal/algorithms/search/binary/binary_fancy.go +++ b/code/golang/internal/algorithms/search/binary/binary_fancy.go @@ -68,9 +68,6 @@ func FancyBinarySearch(input_L []int, input_x int) (int, error) { // Start Message setup.DisplayStartOfAlgorithm(name, inputs) - // Metriken initialisieren - metrics.RestartMetrics() - // Prechecks: if setup.AppConfigPerformChecks() { err = preChecks(input_L, input_x) @@ -80,7 +77,10 @@ func FancyBinarySearch(input_L []int, input_x int) (int, error) { } // Ausführung des Algorithmus: + metrics.ResetMetrics() + metrics.StartMetrics() output_index = BinarySearch(input_L, input_x) + metrics.StopMetrics() outputs = map[string]interface{}{ "index": output_index, } diff --git a/code/golang/internal/algorithms/search/interpol/interpol_fancy.go b/code/golang/internal/algorithms/search/interpol/interpol_fancy.go index 4357078..8d2d43e 100644 --- a/code/golang/internal/algorithms/search/interpol/interpol_fancy.go +++ b/code/golang/internal/algorithms/search/interpol/interpol_fancy.go @@ -70,9 +70,6 @@ func FancyInterpolationSearch(input_L []int, input_x int, input_u int, input_v i // Start Message setup.DisplayStartOfAlgorithm(name, inputs) - // Metriken initialisieren - metrics.RestartMetrics() - // Prechecks: if setup.AppConfigPerformChecks() { err = preChecks(input_L, input_x, input_u, input_v) @@ -82,7 +79,10 @@ func FancyInterpolationSearch(input_L []int, input_x int, input_u int, input_v i } // Ausführung des Algorithmus: + metrics.ResetMetrics() + metrics.StartMetrics() output_index = InterpolationSearch(input_L, input_x, input_u, input_v) + metrics.StopMetrics() outputs = map[string]interface{}{ "index": output_index, } diff --git a/code/golang/internal/algorithms/search/ith_element/ith_element_fancy.go b/code/golang/internal/algorithms/search/ith_element/ith_element_fancy.go index 7f4492a..1caabed 100644 --- a/code/golang/internal/algorithms/search/ith_element/ith_element_fancy.go +++ b/code/golang/internal/algorithms/search/ith_element/ith_element_fancy.go @@ -65,9 +65,6 @@ func FancyFindIthSmallest(input_L []int, input_i int) (int, error) { // Start Message setup.DisplayStartOfAlgorithm(name, inputs) - // Metriken initialisieren - metrics.RestartMetrics() - // Prechecks: if setup.AppConfigPerformChecks() { err = preChecks(input_L, input_i) @@ -77,7 +74,10 @@ func FancyFindIthSmallest(input_L []int, input_i int) (int, error) { } // Ausführung des Algorithmus: + metrics.ResetMetrics() + metrics.StartMetrics() output_value = FindIthSmallest(input_L, input_i) + metrics.StopMetrics() outputs = map[string]interface{}{ "value": output_value, } @@ -125,9 +125,6 @@ func FancyFindIthSmallestDC(input_L []int, input_i int) (int, error) { // Start Message setup.DisplayStartOfAlgorithm(name, inputs) - // Metriken initialisieren - metrics.RestartMetrics() - // Prechecks: if setup.AppConfigPerformChecks() { err = preChecks(input_L, input_i) @@ -137,7 +134,10 @@ func FancyFindIthSmallestDC(input_L []int, input_i int) (int, error) { } // Ausführung des Algorithmus: + metrics.ResetMetrics() + metrics.StartMetrics() output_value = FindIthSmallestDC(input_L, input_i) + metrics.StopMetrics() outputs = map[string]interface{}{ "value": output_value, } diff --git a/code/golang/internal/algorithms/search/jump/jump_fancy.go b/code/golang/internal/algorithms/search/jump/jump_fancy.go index 9248906..fc2480c 100644 --- a/code/golang/internal/algorithms/search/jump/jump_fancy.go +++ b/code/golang/internal/algorithms/search/jump/jump_fancy.go @@ -69,9 +69,6 @@ func FancyJumpSearchLinear(input_L []int, input_x int, input_m int) (int, error) // Start Message setup.DisplayStartOfAlgorithm(name, inputs) - // Metriken initialisieren - metrics.RestartMetrics() - // Prechecks: if setup.AppConfigPerformChecks() { err = preChecks(input_L, input_x, input_m) @@ -81,7 +78,10 @@ func FancyJumpSearchLinear(input_L []int, input_x int, input_m int) (int, error) } // Ausführung des Algorithmus: + metrics.ResetMetrics() + metrics.StartMetrics() output_index = JumpSearchLinear(input_L, input_x, input_m) + metrics.StopMetrics() outputs = map[string]interface{}{ "index": output_index, } @@ -129,9 +129,6 @@ func FancyJumpSearchExponentiell(input_L []int, input_x int) (int, error) { // Start Message setup.DisplayStartOfAlgorithm(name, inputs) - // Metriken initialisieren - metrics.RestartMetrics() - // Prechecks: if setup.AppConfigPerformChecks() { err = preChecks(input_L, input_x) @@ -141,7 +138,10 @@ func FancyJumpSearchExponentiell(input_L []int, input_x int) (int, error) { } // Ausführung des Algorithmus: + metrics.ResetMetrics() + metrics.StartMetrics() output_index = JumpSearchExponentiell(input_L, input_x) + metrics.StopMetrics() outputs = map[string]interface{}{ "index": output_index, } diff --git a/code/golang/internal/algorithms/search/poison/poison_fancy.go b/code/golang/internal/algorithms/search/poison/poison_fancy.go index 2d47586..0bc2acd 100644 --- a/code/golang/internal/algorithms/search/poison/poison_fancy.go +++ b/code/golang/internal/algorithms/search/poison/poison_fancy.go @@ -63,9 +63,6 @@ func FancyFindPoison(input_L []int) (int, error) { // Start Message setup.DisplayStartOfAlgorithm(name, inputs) - // Metriken initialisieren - metrics.RestartMetrics() - // Prechecks: if setup.AppConfigPerformChecks() { err = preChecks(input_L) @@ -75,7 +72,10 @@ func FancyFindPoison(input_L []int) (int, error) { } // Ausführung des Algorithmus: + metrics.ResetMetrics() + metrics.StartMetrics() output_index = FindPoison(input_L) + metrics.StopMetrics() outputs = map[string]interface{}{ "index": output_index, } @@ -122,9 +122,6 @@ func FancyFindPoisonFast(input_L []int) (int, error) { // Start Message setup.DisplayStartOfAlgorithm(name, inputs) - // Metriken initialisieren - metrics.RestartMetrics() - // Prechecks: if setup.AppConfigPerformChecks() { err = preChecks(input_L) @@ -134,7 +131,10 @@ func FancyFindPoisonFast(input_L []int) (int, error) { } // Ausführung des Algorithmus: + metrics.ResetMetrics() + metrics.StartMetrics() output_index = FindPoisonFast(input_L) + metrics.StopMetrics() outputs = map[string]interface{}{ "index": output_index, } diff --git a/code/golang/internal/algorithms/search/sequential/sequential_fancy.go b/code/golang/internal/algorithms/search/sequential/sequential_fancy.go index c2d3e1d..dd90fe8 100644 --- a/code/golang/internal/algorithms/search/sequential/sequential_fancy.go +++ b/code/golang/internal/algorithms/search/sequential/sequential_fancy.go @@ -66,9 +66,6 @@ func FancySequentialSearch(input_L []int, input_x int) (int, error) { // Start Message setup.DisplayStartOfAlgorithm(name, inputs) - // Metriken initialisieren - metrics.RestartMetrics() - // Prechecks: if setup.AppConfigPerformChecks() { err = preChecks(input_L, input_x) @@ -78,7 +75,10 @@ func FancySequentialSearch(input_L []int, input_x int) (int, error) { } // Ausführung des Algorithmus: + metrics.ResetMetrics() + metrics.StartMetrics() output_index = SequentialSearch(input_L, input_x) + metrics.StopMetrics() outputs = map[string]interface{}{ "index": output_index, } diff --git a/code/golang/internal/algorithms/sum/maxsubsum/maxsubsum_fancy.go b/code/golang/internal/algorithms/sum/maxsubsum/maxsubsum_fancy.go index 3d20d32..e0c1782 100644 --- a/code/golang/internal/algorithms/sum/maxsubsum/maxsubsum_fancy.go +++ b/code/golang/internal/algorithms/sum/maxsubsum/maxsubsum_fancy.go @@ -57,9 +57,6 @@ func FancyMaxSubSum(input_L []int) (int, int, int, error) { // Start Message setup.DisplayStartOfAlgorithm(name, inputs) - // Metriken initialisieren - metrics.RestartMetrics() - // Prechecks: if setup.AppConfigPerformChecks() { err = preChecks(input_L) @@ -69,7 +66,10 @@ func FancyMaxSubSum(input_L []int) (int, int, int, error) { } // Ausführung des Algorithmus: + metrics.ResetMetrics() + metrics.StartMetrics() output_maxSum, output_indexFrom, output_indexTo = MaxSubSum(input_L) + metrics.StopMetrics() outputs = map[string]interface{}{ "maxSum": output_maxSum, "index_from": output_indexFrom, @@ -120,9 +120,6 @@ func FancyMaxSubSumDC(input_L []int) (int, int, int, error) { // Start Message setup.DisplayStartOfAlgorithm(name, inputs) - // Metriken initialisieren - metrics.RestartMetrics() - // Prechecks: if setup.AppConfigPerformChecks() { err = preChecks(input_L) @@ -132,7 +129,10 @@ func FancyMaxSubSumDC(input_L []int) (int, int, int, error) { } // Ausführung des Algorithmus: + metrics.ResetMetrics() + metrics.StartMetrics() output_maxSum, output_indexFrom, output_indexTo = MaxSubSumDC(input_L) + metrics.StopMetrics() outputs = map[string]interface{}{ "maxSum": output_maxSum, "index_from": output_indexFrom, diff --git a/code/golang/internal/core/metrics/metrics.go b/code/golang/internal/core/metrics/metrics.go index a3840ee..e1ae241 100644 --- a/code/golang/internal/core/metrics/metrics.go +++ b/code/golang/internal/core/metrics/metrics.go @@ -5,8 +5,10 @@ package metrics * ---------------------------------------------------------------- */ import ( + "fmt" "time" + "ads/internal/core/utils" "ads/internal/types" ) @@ -22,10 +24,18 @@ var _tmr = types.NewTimer() * METHODS * ---------------------------------------------------------------- */ -func RestartMetrics() { - _tmr.Reset() +func ResetMetrics() { _ctr_time.Reset() _ctr_space.Reset() + _tmr.Reset() +} + +func StartMetrics() { + _tmr.Start() +} + +func StopMetrics() { + _tmr.Stop() } func AddTimeCost(options ...int) { @@ -45,6 +55,22 @@ func GetSpaceCost() int { } func GetTimeElapsed() time.Duration { - _tmr.Stop() return _tmr.ElapsedTime() } + +func GetTimeElapsedLongFormat() string { + t := _tmr.ElapsedTime() + h := utils.Floor(t.Hours()) + m := utils.Floor(t.Minutes()) - h*60 + s := t.Seconds() - float64(m*60) + h_string := fmt.Sprintf("%v", h) + for len(h_string) < 2 { + h_string = "0" + h_string + } + m_string := fmt.Sprintf("%v", m) + for len(m_string) < 2 { + m_string = "0" + m_string + } + s_string := fmt.Sprintf("%f", s) + return fmt.Sprintf("%[1]s:%[2]s:%[3]s", h_string, m_string, s_string) +} diff --git a/code/golang/internal/setup/setup_display.go b/code/golang/internal/setup/setup_display.go index a3337d5..d9c74be 100644 --- a/code/golang/internal/setup/setup_display.go +++ b/code/golang/internal/setup/setup_display.go @@ -96,7 +96,8 @@ func DisplayEndOfAlgorithm(outputs map[string]interface{}) { } func DisplayMetrics() { - logging.LogPlain(fmt.Sprintf("Dauer der Ausführung: t = \033[1m%[1]v\033[0m", metrics.GetTimeElapsed())) + // logging.LogPlain(fmt.Sprintf("Dauer der Ausführung: t = \033[1m%[1]v\033[0m", metrics.GetTimeElapsed())) + logging.LogPlain(fmt.Sprintf("Dauer der Ausführung: t = \033[1m%[1]v\033[0m", metrics.GetTimeElapsedLongFormat())) logging.LogPlain(fmt.Sprintf("Kosten (Zeit): T(n) = \033[1m%[1]v\033[0m", metrics.GetTimeCost())) logging.LogPlain(fmt.Sprintf("Kosten (Platz): S(n) = \033[1m%[1]v\033[0m", metrics.GetSpaceCost())) return diff --git a/code/golang/internal/types/types_timer.go b/code/golang/internal/types/types_timer.go index dcbb4a6..0ef3a35 100644 --- a/code/golang/internal/types/types_timer.go +++ b/code/golang/internal/types/types_timer.go @@ -22,6 +22,7 @@ import ( type Timer struct { time_elapsed time.Duration time_current time.Time + running bool } /* ---------------------------------------------------------------- * @@ -48,14 +49,18 @@ func (self Timer) ElapsedTime() time.Duration { func (self *Timer) Start() { self.time_current = time.Now() + self.running = true } func (self *Timer) Stop() { - t0 := self.time_current - t1 := time.Now() - delta := t1.Sub(t0) - self.time_current = t1 - self.time_elapsed += delta + if self.running { + t0 := self.time_current + t1 := time.Now() + delta := t1.Sub(t0) + self.time_current = t1 + self.time_elapsed += delta + } + self.running = false } func (self *Timer) Reset() { @@ -63,4 +68,5 @@ func (self *Timer) Reset() { delta := t.Sub(t) // d. h. 0 self.time_current = t self.time_elapsed = delta + self.running = false } diff --git a/code/python/src/algorithms/methods.py b/code/python/src/algorithms/methods.py index 5fa4e58..79c4a0f 100644 --- a/code/python/src/algorithms/methods.py +++ b/code/python/src/algorithms/methods.py @@ -66,17 +66,21 @@ def algorithmInfos( if state: # Initialisierung DisplayStartOfAlgorithm(name, **inputs); - RestartMetrics(); # Prechecks if checks and callable(preChecks): preChecks(**inputs); - # Ausführung des Algorithmus: + # Metriken initialisieren + starten + ResetMetrics(); + StartMetrics(); + # Ausführung des Algorithmus: nonnestedRecursion.trigger(); nonnestedAlgorithms.trigger(); outputs = func(*[], **inputs); nonnestedAlgorithms.state = state1; nonnestedRecursion.state = state2; if state: + # Metriken anhalten + StopMetrics(); # benenne Outputs: outputs_ = outputs if isinstance(outputs, tuple) else tuple([outputs]); outputsNamed = { outputnames[k]: value for k, value in enumerate(outputs_) }; diff --git a/code/python/src/core/metrics.py b/code/python/src/core/metrics.py index 6800a64..441a988 100644 --- a/code/python/src/core/metrics.py +++ b/code/python/src/core/metrics.py @@ -49,6 +49,7 @@ class Counter(object): class Timer(object): _time_elapsed: timedelta; _time_current: datetime; + _running: bool def __init__(self): self.reset(); @@ -62,14 +63,17 @@ class Timer(object): def start(self): self._time_current = datetime.now(); + self._running = True return self; def stop(self): - t0 = self._time_current; - t1 = datetime.now(); - delta = t1 - t0; - self._time_current = t1; - self._time_elapsed += delta; + if self._running: + t0 = self._time_current; + t1 = datetime.now(); + delta = t1 - t0; + self._time_current = t1; + self._time_elapsed += delta; + self._running = False return self; def reset(self): @@ -77,6 +81,7 @@ class Timer(object): delta = t - t; self._time_current = t; self._time_elapsed = delta; + self._running = False return self; ## Initialisierung: @@ -88,7 +93,7 @@ _tmr = Timer(); # METHODS # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -def RestartMetrics(): +def ResetMetrics(): global _ctr_time; global _ctr_space; global _tmr; @@ -98,6 +103,14 @@ def RestartMetrics(): _tmr.reset(); return; +def StartMetrics(): + _tmr.start() + return; + +def StopMetrics(): + _tmr.stop() + return; + def AddTimeCost(n: int = 1): global _ctr_time; _ctr_time.add(n);