多次评估单个表达式的 mxparser 性能
mxparser performance for single expression evaluated multiple times
我有一个场景,我需要对一个表达式求值 100 万次,但在每次迭代中唯一改变的是参数值:
var x1 = new Argument("X1", double.NaN);
var x2 = new Argument("X2", double.NaN);
var x3 = new Argument("X3", double.NaN);
Expression expression = new Expression(
"coalesce(X1, 0) + coalesce(X2, 0) + coalesce(X3, 0)",
x1, x2, x3);
var calculateElapsed = new List<double>();
var getComputingTime = new List<double>();
var s1 = mXparser.currentTimeMillis();
foreach (var i in Enumerable.Range(1, 1000000))
{
x1.setArgumentValue(i % 5 == 0 ? double.NaN : i % 5);
x2.setArgumentValue(i % 7 == 0 ? double.NaN : i % 7);
x3.setArgumentValue(i % 3 == 0 ? double.NaN : i % 3);
var s2 = mXparser.currentTimeMillis();
expression.calculate();
var e2 = mXparser.currentTimeMillis();
calculateElapsed.Add(e2 - s2);
getComputingTime.Add(expression.getComputingTime());
}
var e1 = mXparser.currentTimeMillis();
根据 运行 的基准统计数据,getComputingTime() 测得的值明显小于 getCurrentMillis()表示某种预评估开销。
-----------------------------------------------------------------------------------
| | Avg(ms) | Median(ms) | Min(ms) | Max(ms) | Total(ms) |
-----------------------------------------------------------------------------------
| getComputingTime | 0.000004 | 0.000000 | 0.000000 | 0.121000 | 4.206000 |
-----------------------------------------------------------------------------------
| calculate() | 0.004300 | 0.000000 | 0.000000 | 131.000000 | 4,300.000000 |
-----------------------------------------------------------------------------------
我不确定这应该是多少开销,因为我假设表达式不会改变,所以我们只需要解析一次。
当表达式是相同且仅参数值不同?
Max 最有可能是第一次调用 calculate(),所有 pre-compilation 都已完成。您只是在更改参数值,因此 mXparser 在第一次调用 calculate() 方法后会非常快速地计算它。从统计第一次迭代中删除,然后重新运行测试。
我有一个场景,我需要对一个表达式求值 100 万次,但在每次迭代中唯一改变的是参数值:
var x1 = new Argument("X1", double.NaN);
var x2 = new Argument("X2", double.NaN);
var x3 = new Argument("X3", double.NaN);
Expression expression = new Expression(
"coalesce(X1, 0) + coalesce(X2, 0) + coalesce(X3, 0)",
x1, x2, x3);
var calculateElapsed = new List<double>();
var getComputingTime = new List<double>();
var s1 = mXparser.currentTimeMillis();
foreach (var i in Enumerable.Range(1, 1000000))
{
x1.setArgumentValue(i % 5 == 0 ? double.NaN : i % 5);
x2.setArgumentValue(i % 7 == 0 ? double.NaN : i % 7);
x3.setArgumentValue(i % 3 == 0 ? double.NaN : i % 3);
var s2 = mXparser.currentTimeMillis();
expression.calculate();
var e2 = mXparser.currentTimeMillis();
calculateElapsed.Add(e2 - s2);
getComputingTime.Add(expression.getComputingTime());
}
var e1 = mXparser.currentTimeMillis();
根据 运行 的基准统计数据,getComputingTime() 测得的值明显小于 getCurrentMillis()表示某种预评估开销。
-----------------------------------------------------------------------------------
| | Avg(ms) | Median(ms) | Min(ms) | Max(ms) | Total(ms) |
-----------------------------------------------------------------------------------
| getComputingTime | 0.000004 | 0.000000 | 0.000000 | 0.121000 | 4.206000 |
-----------------------------------------------------------------------------------
| calculate() | 0.004300 | 0.000000 | 0.000000 | 131.000000 | 4,300.000000 |
-----------------------------------------------------------------------------------
我不确定这应该是多少开销,因为我假设表达式不会改变,所以我们只需要解析一次。
当表达式是相同且仅参数值不同?
Max 最有可能是第一次调用 calculate(),所有 pre-compilation 都已完成。您只是在更改参数值,因此 mXparser 在第一次调用 calculate() 方法后会非常快速地计算它。从统计第一次迭代中删除,然后重新运行测试。