Improve performance of reading array values
diff --git a/EPPlus/CellStore.cs b/EPPlus/CellStore.cs
index a3c8598..d977a96 100644
--- a/EPPlus/CellStore.cs
+++ b/EPPlus/CellStore.cs
@@ -68,7 +68,7 @@
{
var page = (short)(Row >> CellStore<int>.pageBits);
_searchIx.Index = page;
- var res = Array.BinarySearch(_pages, 0, PageCount, _searchIx);
+ var res = (_pages[page].Index == page) ? page : Array.BinarySearch(_pages, 0, PageCount, _searchIx);
if (res >= 0)
{
GetPage(Row, ref res);
@@ -263,7 +263,7 @@
internal int GetPosition(int offset)
{
_searchIx.Index = (short)offset;
- return Array.BinarySearch(Rows, 0, RowCount, _searchIx);
+ return (Rows[offset-1].Index == offset) ? offset-1 : Array.BinarySearch(Rows, 0, RowCount, _searchIx);
}
internal int GetNextRow(int row)
{
@@ -355,7 +355,7 @@
internal int GetPosition(int Column)
{
_searchIx.Index = (short)Column;
- return Array.BinarySearch(_columnIndex, 0, ColumnCount, _searchIx);
+ return (_columnIndex[Column-1].Index == Column) ? Column-1 : Array.BinarySearch(_columnIndex, 0, ColumnCount, _searchIx);
}
internal CellStore<T> Clone()
{
@@ -568,7 +568,7 @@
}
short ix = (short)(Row - pageItem.IndexOffset);
_searchIx.Index = ix;
- var cellPos = Array.BinarySearch(pageItem.Rows, 0, pageItem.RowCount, _searchIx);
+ var cellPos = (pageItem.Rows[ix-1].Index == ix) ? ix-1 : Array.BinarySearch(pageItem.Rows, 0, pageItem.RowCount, _searchIx);
if (cellPos >= 0)
{
return pageItem.Rows[cellPos].IndexPointer;
@@ -609,7 +609,7 @@
{
lock (_columnIndex)
{
- var col = Array.BinarySearch(_columnIndex, 0, ColumnCount, new IndexBase() { Index = (short)(Column) });
+ var col = (_columnIndex[Column-1].Index == Column) ? Column-1 : Array.BinarySearch(_columnIndex, 0, ColumnCount, new IndexBase() { Index = (short)(Column) });
var page = (short)(Row >> pageBits);
if (col >= 0)
{
@@ -645,7 +645,7 @@
short ix = (short)(Row - ((pageItem.Index << pageBits) + pageItem.Offset));
_searchIx.Index = ix;
- var cellPos = Array.BinarySearch(pageItem.Rows, 0, pageItem.RowCount, _searchIx);
+ var cellPos = (pageItem.Rows[ix].Index == ix) ? ix : Array.BinarySearch(pageItem.Rows, 0, pageItem.RowCount, _searchIx);
if (cellPos < 0)
{
cellPos = ~cellPos;