Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Creating specialized stateful expression in order to improve performance and code clarity. Speicalized stateful expression eliminates all heap allocations and most of interface{} conversions. The idea behind "specialized stateful expression" is to implement (very very simple) "JIT Compiler" for stateful expression. For example: given this expression ``"value" > 8.0``, at runtime we will try to find the type of "value", once we find the type (for this example, let's say it's float64) we will comparison functions which accepts float64 both on the right and left side. Contiuing with our example, let's say that on runtime after evaluating multiple times - "value" changed is type to int64, if that happens - we will have "type guard" that will raise an error and say this is not "float64 > float64" it's "int64 > float64" and we will adjust the evaluation function. There are more changes, those are the bottom line: * Tests - lots of tests added, at the time of writing this commit we have 77.8% coverage for "stateful" package. * Compile time errors - simple compile time errors that will stop the tasks starting if there is some simple mistakes. Finally, benchmarks: * Compared against the interepeted one - "NewStatefulExpr" * Ran with count=5 on Macbook Pro 13" Late 2011 (i5, 8GB RAM, 120GB SSD) name me old time/op new time/op delta _EvalBool_OneOperator_UnaryNode_BoolNode-4 252ns ± 2% 16ns ± 3% -93.53% (p=0.008 n=5+5) _EvalBool_OneOperator_NumberFloat64_NumberFloat64-4 540ns ± 2% 40ns ± 2% -92.58% (p=0.008 n=5+5) _EvalBool_OneOperator_NumberFloat64_NumberInt64-4 550ns ± 3% 40ns ± 3% -92.68% (p=0.008 n=5+5) _EvalBool_OneOperator_NumberInt64_NumberInt64-4 539ns ± 2% 39ns ± 4% -92.77% (p=0.008 n=5+5) _EvalBool_OneOperator_ReferenceNodeFloat64_NumberFloat64-4 524ns ± 3% 74ns ± 5% -85.93% (p=0.008 n=5+5) _EvalBool_OneOperator_ReferenceNodeFloat64_NumberInt64-4 526ns ± 1% 76ns ± 3% -85.51% (p=0.008 n=5+5) _EvalBool_OneOperator_ReferenceNodeFloat64_ReferenceNodeFloat64-4 495ns ± 3% 116ns ± 4% -76.48% (p=0.008 n=5+5) _EvalBool_OneOperatorWith11ScopeItem_ReferenceNodeFloat64_NumberFloat64-4 534ns ± 3% 90ns ± 4% -83.11% (p=0.008 n=5+5) _EvalBool_OneOperatorValueChanges_ReferenceNodeFloat64_NumberFloat64-4 2.98µs ± 1% 1.24µs ± 3% -58.44% (p=0.008 n=5+5) _EvalBool_OneOperator_ReferenceNodeInt64_ReferenceNodeInt64-4 503ns ± 3% 119ns ± 7% -76.25% (p=0.008 n=5+5) _EvalBool_OneOperatorWith11ScopeItem_ReferenceNodeInt64_NumberInt64-4 533ns ± 1% 87ns ± 3% -83.69% (p=0.008 n=5+5) _EvalBool_OneOperatorValueChanges_ReferenceNodeInt64_NumberInt64-4 3.08µs ± 4% 1.26µs ± 3% -59.22% (p=0.008 n=5+5) name old alloc/op new alloc/op delta _EvalBool_OneOperator_UnaryNode_BoolNode-4 18.0B ± 0% 0.0B ±NaN% -100.00% (p=0.008 n=5+5) _EvalBool_OneOperator_NumberFloat64_NumberFloat64-4 72.0B ± 0% 0.0B ±NaN% -100.00% (p=0.008 n=5+5) _EvalBool_OneOperator_NumberFloat64_NumberInt64-4 72.0B ± 0% 0.0B ±NaN% -100.00% (p=0.008 n=5+5) _EvalBool_OneOperator_NumberInt64_NumberInt64-4 72.0B ± 0% 0.0B ±NaN% -100.00% (p=0.008 n=5+5) _EvalBool_OneOperator_ReferenceNodeFloat64_NumberFloat64-4 64.0B ± 0% 0.0B ±NaN% -100.00% (p=0.008 n=5+5) _EvalBool_OneOperator_ReferenceNodeFloat64_NumberInt64-4 64.0B ± 0% 0.0B ±NaN% -100.00% (p=0.008 n=5+5) _EvalBool_OneOperator_ReferenceNodeFloat64_ReferenceNodeFloat64-4 49.0B ± 0% 0.0B ±NaN% -100.00% (p=0.008 n=5+5) _EvalBool_OneOperatorWith11ScopeItem_ReferenceNodeFloat64_NumberFloat64-4 64.0B ± 0% 0.0B ±NaN% -100.00% (p=0.008 n=5+5) _EvalBool_OneOperatorValueChanges_ReferenceNodeFloat64_NumberFloat64-4 64.0B ± 0% 0.0B ±NaN% -100.00% (p=0.008 n=5+5) _EvalBool_OneOperator_ReferenceNodeInt64_ReferenceNodeInt64-4 49.0B ± 0% 0.0B ±NaN% -100.00% (p=0.008 n=5+5) _EvalBool_OneOperatorWith11ScopeItem_ReferenceNodeInt64_NumberInt64-4 64.0B ± 0% 0.0B ±NaN% -100.00% (p=0.008 n=5+5) _EvalBool_OneOperatorValueChanges_ReferenceNodeInt64_NumberInt64-4 64.0B ± 0% 0.0B ±NaN% -100.00% (p=0.008 n=5+5) name old allocs/op new allocs/op delta _EvalBool_OneOperator_UnaryNode_BoolNode-4 3.00 ± 0% 0.00 ±NaN% -100.00% (p=0.008 n=5+5) _EvalBool_OneOperator_NumberFloat64_NumberFloat64-4 5.00 ± 0% 0.00 ±NaN% -100.00% (p=0.008 n=5+5) _EvalBool_OneOperator_NumberFloat64_NumberInt64-4 5.00 ± 0% 0.00 ±NaN% -100.00% (p=0.008 n=5+5) _EvalBool_OneOperator_NumberInt64_NumberInt64-4 5.00 ± 0% 0.00 ±NaN% -100.00% (p=0.008 n=5+5) _EvalBool_OneOperator_ReferenceNodeFloat64_NumberFloat64-4 4.00 ± 0% 0.00 ±NaN% -100.00% (p=0.008 n=5+5) _EvalBool_OneOperator_ReferenceNodeFloat64_NumberInt64-4 4.00 ± 0% 0.00 ±NaN% -100.00% (p=0.008 n=5+5) _EvalBool_OneOperator_ReferenceNodeFloat64_ReferenceNodeFloat64-4 3.00 ± 0% 0.00 ±NaN% -100.00% (p=0.008 n=5+5) _EvalBool_OneOperatorWith11ScopeItem_ReferenceNodeFloat64_NumberFloat64-4 4.00 ± 0% 0.00 ±NaN% -100.00% (p=0.008 n=5+5) _EvalBool_OneOperatorValueChanges_ReferenceNodeFloat64_NumberFloat64-4 4.00 ± 0% 0.00 ±NaN% -100.00% (p=0.008 n=5+5) _EvalBool_OneOperator_ReferenceNodeInt64_ReferenceNodeInt64-4 3.00 ± 0% 0.00 ±NaN% -100.00% (p=0.008 n=5+5) _EvalBool_OneOperatorWith11ScopeItem_ReferenceNodeInt64_NumberInt64-4 4.00 ± 0% 0.00 ±NaN% -100.00% (p=0.008 n=5+5) _EvalBool_OneOperatorValueChanges_ReferenceNodeInt64_NumberInt64-4 4.00 ± 0% 0.00 ±NaN% -100.00% (p=0.008 n=5+5)
- Loading branch information