From bc6d68da366c595fd643ed5919823fd494b60dec Mon Sep 17 00:00:00 2001 From: ylecarvalho Date: Wed, 19 Nov 2025 14:10:04 -0300 Subject: [PATCH] feat: Optimized index lookup in DateTimeCategoryAxis using binary search - Added `_binarySearch` helper method. --- .../charts/axis/datetime_category_axis.dart | 36 ++++++++++++++++--- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/packages/syncfusion_flutter_charts/lib/src/charts/axis/datetime_category_axis.dart b/packages/syncfusion_flutter_charts/lib/src/charts/axis/datetime_category_axis.dart index ec00cdda2..b941e1d4f 100644 --- a/packages/syncfusion_flutter_charts/lib/src/charts/axis/datetime_category_axis.dart +++ b/packages/syncfusion_flutter_charts/lib/src/charts/axis/datetime_category_axis.dart @@ -1157,13 +1157,18 @@ class RenderDateTimeCategoryAxis extends RenderChartAxis { int maxValue = 0; for (int i = 0; i < length; i++) { final int rawX = (xRawValues[i] as DateTime).millisecondsSinceEpoch; - if (!labels.contains(rawX)) { + final index = _binarySearch(labels, rawX); + + final int indexValidated; + if (index < 0) { labels.add(rawX); + indexValidated = labels.length - 1; + } else { + indexValidated = index; } - final int index = labels.indexOf(rawX); - dependent.xValues[i] = index; - maxValue = max(maxValue, index); + dependent.xValues[i] = indexValidated; + maxValue = max(maxValue, indexValidated); } dependent.xMin = minValue; dependent.xMax = maxValue; @@ -1172,6 +1177,29 @@ class RenderDateTimeCategoryAxis extends RenderChartAxis { } } + int _binarySearch(List sortedList, int target) { + int low = 0; + int high = sortedList.length - 1; + + while (low <= high) { + final int mid = + low + ((high - low) ~/ 2); // Integer division for the midpoint + final midSample = sortedList.elementAt(mid); + + final int comparison = midSample.compareTo(target); + + if (comparison == 0) { + return mid; // Found the target + } else if (comparison < 0) { + low = mid + 1; // Target is in the right half + } else { + high = mid - 1; // Target is in the left half + } + } + + return -1; // Target not found + } + @override void dispose() { _multilevelLabels.clear();