一个C#写的四则运算表达式的计算器;
使用字符解析,没有使用正则或其他文法解析库,并且用了.Net Core 2.1新增的Span库来提升效率,所以只能运行在.Net Core2.1以上的版本。
var cacl = new Calculator();
var result = cacl.Sum(" ( ((1 + 1 )+ (321+3)) +( 3 + 2))* 4/((6 -4)+2)");
Assert.AreEqual(result , (((1 + 1) + (321 + 3)) + (3 + 2)) * 4 / ((6 - 4) + 2));
Git分支里有两种解析版本的代码Span和Sparche,经过测试对比,使用Span类库的代码效率提升显著:
测试代码:
var cacl = new Calculator();
var expr = " ( 123.22 +1+ 2* 4 ) +((2-1)*1-(3+(341-5-12-2) ))-6/2 ";
var result = cacl.Sum(expr);
var start = DateTime.Now;
for (int i = 0; i < 200000; i++)
{
cacl.Sum(expr);
}
var end = DateTime.Now;
Console.WriteLine(end-start);
以下结果为运行在Debug模式下的测试结果:
|
Sprache | Span |
1万次 |
00:00:02.6483960 |
00:00:00.2008868 |
5万次 |
00:00:13.8313581 |
00:00:00.9584799 |
10万次 |
00:00:25.0149718 |
00:00:01.9015189 |
20万次 |
00:00:50.8499154 |
00:00:03.8516696 |