Skip to content

Commit f28c3bf

Browse files
committed
Added branchless Math.Min calculation
1 parent a21cc69 commit f28c3bf

File tree

2 files changed

+50
-34
lines changed

2 files changed

+50
-34
lines changed
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Runtime.CompilerServices;
4+
using System.Text;
5+
6+
namespace Quickenshtein.Internal
7+
{
8+
internal static class AdvOperations
9+
{
10+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
11+
public static int MathMin(int x, int y)
12+
{
13+
return y + ((x - y) & ((x - y) >> (sizeof(int) * 8 - 1)));
14+
}
15+
}
16+
}

src/Quickenshtein/Levenshtein.Common.cs

Lines changed: 34 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,8 @@ internal static unsafe void CalculateRow(int* previousRowPtr, char* targetPtr, i
3535
lastDeletionCost = previousRowPtr[0];
3636
if (sourcePrevChar != targetPtr[0])
3737
{
38-
localCost = Math.Min(lastInsertionCost, localCost);
39-
localCost = Math.Min(lastDeletionCost, localCost);
38+
localCost = AdvOperations.MathMin(lastInsertionCost, localCost);
39+
localCost = AdvOperations.MathMin(lastDeletionCost, localCost);
4040
localCost++;
4141
}
4242
lastInsertionCost = localCost;
@@ -49,8 +49,8 @@ internal static unsafe void CalculateRow(int* previousRowPtr, char* targetPtr, i
4949
lastDeletionCost = previousRowPtr[0];
5050
if (sourcePrevChar != targetPtr[0])
5151
{
52-
localCost = Math.Min(lastInsertionCost, localCost);
53-
localCost = Math.Min(lastDeletionCost, localCost);
52+
localCost = AdvOperations.MathMin(lastInsertionCost, localCost);
53+
localCost = AdvOperations.MathMin(lastDeletionCost, localCost);
5454
localCost++;
5555
}
5656
lastInsertionCost = localCost;
@@ -63,8 +63,8 @@ internal static unsafe void CalculateRow(int* previousRowPtr, char* targetPtr, i
6363
lastDeletionCost = previousRowPtr[0];
6464
if (sourcePrevChar != targetPtr[0])
6565
{
66-
localCost = Math.Min(lastInsertionCost, localCost);
67-
localCost = Math.Min(lastDeletionCost, localCost);
66+
localCost = AdvOperations.MathMin(lastInsertionCost, localCost);
67+
localCost = AdvOperations.MathMin(lastDeletionCost, localCost);
6868
localCost++;
6969
}
7070
lastInsertionCost = localCost;
@@ -77,8 +77,8 @@ internal static unsafe void CalculateRow(int* previousRowPtr, char* targetPtr, i
7777
lastDeletionCost = previousRowPtr[0];
7878
if (sourcePrevChar != targetPtr[0])
7979
{
80-
localCost = Math.Min(lastInsertionCost, localCost);
81-
localCost = Math.Min(lastDeletionCost, localCost);
80+
localCost = AdvOperations.MathMin(lastInsertionCost, localCost);
81+
localCost = AdvOperations.MathMin(lastDeletionCost, localCost);
8282
localCost++;
8383
}
8484
lastInsertionCost = localCost;
@@ -91,8 +91,8 @@ internal static unsafe void CalculateRow(int* previousRowPtr, char* targetPtr, i
9191
lastDeletionCost = previousRowPtr[0];
9292
if (sourcePrevChar != targetPtr[0])
9393
{
94-
localCost = Math.Min(lastInsertionCost, localCost);
95-
localCost = Math.Min(lastDeletionCost, localCost);
94+
localCost = AdvOperations.MathMin(lastInsertionCost, localCost);
95+
localCost = AdvOperations.MathMin(lastDeletionCost, localCost);
9696
localCost++;
9797
}
9898
lastInsertionCost = localCost;
@@ -105,8 +105,8 @@ internal static unsafe void CalculateRow(int* previousRowPtr, char* targetPtr, i
105105
lastDeletionCost = previousRowPtr[0];
106106
if (sourcePrevChar != targetPtr[0])
107107
{
108-
localCost = Math.Min(lastInsertionCost, localCost);
109-
localCost = Math.Min(lastDeletionCost, localCost);
108+
localCost = AdvOperations.MathMin(lastInsertionCost, localCost);
109+
localCost = AdvOperations.MathMin(lastDeletionCost, localCost);
110110
localCost++;
111111
}
112112
lastInsertionCost = localCost;
@@ -119,8 +119,8 @@ internal static unsafe void CalculateRow(int* previousRowPtr, char* targetPtr, i
119119
lastDeletionCost = previousRowPtr[0];
120120
if (sourcePrevChar != targetPtr[0])
121121
{
122-
localCost = Math.Min(lastInsertionCost, localCost);
123-
localCost = Math.Min(lastDeletionCost, localCost);
122+
localCost = AdvOperations.MathMin(lastInsertionCost, localCost);
123+
localCost = AdvOperations.MathMin(lastDeletionCost, localCost);
124124
localCost++;
125125
}
126126
lastInsertionCost = localCost;
@@ -133,8 +133,8 @@ internal static unsafe void CalculateRow(int* previousRowPtr, char* targetPtr, i
133133
lastDeletionCost = previousRowPtr[0];
134134
if (sourcePrevChar != targetPtr[0])
135135
{
136-
localCost = Math.Min(lastInsertionCost, localCost);
137-
localCost = Math.Min(lastDeletionCost, localCost);
136+
localCost = AdvOperations.MathMin(lastInsertionCost, localCost);
137+
localCost = AdvOperations.MathMin(lastDeletionCost, localCost);
138138
localCost++;
139139
}
140140
lastInsertionCost = localCost;
@@ -152,8 +152,8 @@ internal static unsafe void CalculateRow(int* previousRowPtr, char* targetPtr, i
152152
lastDeletionCost = previousRowPtr[0];
153153
if (sourcePrevChar != targetPtr[0])
154154
{
155-
localCost = Math.Min(lastInsertionCost, localCost);
156-
localCost = Math.Min(lastDeletionCost, localCost);
155+
localCost = AdvOperations.MathMin(lastInsertionCost, localCost);
156+
localCost = AdvOperations.MathMin(lastDeletionCost, localCost);
157157
localCost++;
158158
}
159159
lastInsertionCost = localCost;
@@ -166,8 +166,8 @@ internal static unsafe void CalculateRow(int* previousRowPtr, char* targetPtr, i
166166
lastDeletionCost = previousRowPtr[0];
167167
if (sourcePrevChar != targetPtr[0])
168168
{
169-
localCost = Math.Min(lastInsertionCost, localCost);
170-
localCost = Math.Min(lastDeletionCost, localCost);
169+
localCost = AdvOperations.MathMin(lastInsertionCost, localCost);
170+
localCost = AdvOperations.MathMin(lastDeletionCost, localCost);
171171
localCost++;
172172
}
173173
lastInsertionCost = localCost;
@@ -180,8 +180,8 @@ internal static unsafe void CalculateRow(int* previousRowPtr, char* targetPtr, i
180180
lastDeletionCost = previousRowPtr[0];
181181
if (sourcePrevChar != targetPtr[0])
182182
{
183-
localCost = Math.Min(lastInsertionCost, localCost);
184-
localCost = Math.Min(lastDeletionCost, localCost);
183+
localCost = AdvOperations.MathMin(lastInsertionCost, localCost);
184+
localCost = AdvOperations.MathMin(lastDeletionCost, localCost);
185185
localCost++;
186186
}
187187
lastInsertionCost = localCost;
@@ -194,8 +194,8 @@ internal static unsafe void CalculateRow(int* previousRowPtr, char* targetPtr, i
194194
lastDeletionCost = previousRowPtr[0];
195195
if (sourcePrevChar != targetPtr[0])
196196
{
197-
localCost = Math.Min(lastInsertionCost, localCost);
198-
localCost = Math.Min(lastDeletionCost, localCost);
197+
localCost = AdvOperations.MathMin(lastInsertionCost, localCost);
198+
localCost = AdvOperations.MathMin(lastDeletionCost, localCost);
199199
localCost++;
200200
}
201201
lastInsertionCost = localCost;
@@ -213,8 +213,8 @@ internal static unsafe void CalculateRow(int* previousRowPtr, char* targetPtr, i
213213
lastDeletionCost = previousRowPtr[0];
214214
if (sourcePrevChar != targetPtr[0])
215215
{
216-
localCost = Math.Min(lastInsertionCost, localCost);
217-
localCost = Math.Min(lastDeletionCost, localCost);
216+
localCost = AdvOperations.MathMin(lastInsertionCost, localCost);
217+
localCost = AdvOperations.MathMin(lastDeletionCost, localCost);
218218
localCost++;
219219
}
220220
lastInsertionCost = localCost;
@@ -307,35 +307,35 @@ private static unsafe void CalculateColumn_4Rows(ref char* targetPtr, ref int* p
307307
var localCost = row1Costs;
308308
if (sourceChar1 != targetChar)
309309
{
310-
localCost = Math.Min(row2Costs, localCost);
311-
localCost = Math.Min(lastDeletionCost, localCost);
310+
localCost = AdvOperations.MathMin(row2Costs, localCost);
311+
localCost = AdvOperations.MathMin(lastDeletionCost, localCost);
312312
localCost++;
313313
}
314314
row1Costs = lastDeletionCost;
315315
lastDeletionCost = localCost;
316316
localCost = row2Costs;
317317
if (sourceChar2 != targetChar)
318318
{
319-
localCost = Math.Min(row3Costs, localCost);
320-
localCost = Math.Min(lastDeletionCost, localCost);
319+
localCost = AdvOperations.MathMin(row3Costs, localCost);
320+
localCost = AdvOperations.MathMin(lastDeletionCost, localCost);
321321
localCost++;
322322
}
323323
row2Costs = lastDeletionCost;
324324
lastDeletionCost = localCost;
325325
localCost = row3Costs;
326326
if (sourceChar3 != targetChar)
327327
{
328-
localCost = Math.Min(row4Costs, localCost);
329-
localCost = Math.Min(lastDeletionCost, localCost);
328+
localCost = AdvOperations.MathMin(row4Costs, localCost);
329+
localCost = AdvOperations.MathMin(lastDeletionCost, localCost);
330330
localCost++;
331331
}
332332
row3Costs = lastDeletionCost;
333333
lastDeletionCost = localCost;
334334
localCost = row4Costs;
335335
if (sourceChar4 != targetChar)
336336
{
337-
localCost = Math.Min(row5Costs, localCost);
338-
localCost = Math.Min(lastDeletionCost, localCost);
337+
localCost = AdvOperations.MathMin(row5Costs, localCost);
338+
localCost = AdvOperations.MathMin(lastDeletionCost, localCost);
339339
localCost++;
340340
}
341341
row4Costs = lastDeletionCost;

0 commit comments

Comments
 (0)