From d617a09533669c25d753225fded5396820ba177e Mon Sep 17 00:00:00 2001 From: Jago Stong-Wright Date: Thu, 22 Dec 2022 11:57:23 +0000 Subject: [PATCH 1/3] Inbounds'ed some array indexing, saves ~18% per `index_binary_search` call --- src/Fields/interpolate.jl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Fields/interpolate.jl b/src/Fields/interpolate.jl index 3544aaf342..2d0ee51dfe 100644 --- a/src/Fields/interpolate.jl +++ b/src/Fields/interpolate.jl @@ -25,9 +25,9 @@ Code credit: https://computersciencehub.io/julia/code-for-binary-search-algorith while low + 1 < high mid = middle_point(low, high) - if vec[mid + 1] == val + if @inbounds vec[mid + 1] == val return (mid + 1, mid + 1) - elseif vec[mid + 1] < val + elseif @inbounds vec[mid + 1] < val low = mid else high = mid From ae3a6dfa59d7308f7e36024e80f1491534caa113 Mon Sep 17 00:00:00 2001 From: Jago Stong-Wright Date: Thu, 22 Dec 2022 13:53:28 +0000 Subject: [PATCH 2/3] Halfs time and since is only used internally seems safe to remove `issorted` --- src/Fields/interpolate.jl | 30 +++++++++++++----------------- 1 file changed, 13 insertions(+), 17 deletions(-) diff --git a/src/Fields/interpolate.jl b/src/Fields/interpolate.jl index 2d0ee51dfe..8cfbe8de91 100644 --- a/src/Fields/interpolate.jl +++ b/src/Fields/interpolate.jl @@ -19,25 +19,21 @@ using a binary search. The input array `vec` has to be monotonically increasing. Code credit: https://computersciencehub.io/julia/code-for-binary-search-algorithm-julia """ @inline function index_binary_search(vec, val, array_size) - if issorted(vec) - low = 0 - high = array_size - 1 - - while low + 1 < high - mid = middle_point(low, high) - if @inbounds vec[mid + 1] == val - return (mid + 1, mid + 1) - elseif @inbounds vec[mid + 1] < val - low = mid - else - high = mid - end + low = 0 + high = array_size - 1 + + while low + 1 < high + mid = middle_point(low, high) + if @inbounds vec[mid + 1] == val + return (mid + 1, mid + 1) + elseif @inbounds vec[mid + 1] < val + low = mid + else + high = mid end - - return (low + 1, high + 1) - else - throw(error("Vector not sorted, unable to search value")) end + + return (low + 1, high + 1) end @inline function fractional_index(array_size::Int, val::FT, vec) where {FT} From 441cd968af3825ccdb16035a64472d66a7510147 Mon Sep 17 00:00:00 2001 From: Jago Stong-Wright Date: Thu, 29 Dec 2022 11:02:58 +0000 Subject: [PATCH 3/3] Updated code credits --- src/Fields/interpolate.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Fields/interpolate.jl b/src/Fields/interpolate.jl index 8cfbe8de91..60ed047064 100644 --- a/src/Fields/interpolate.jl +++ b/src/Fields/interpolate.jl @@ -16,7 +16,7 @@ vec[low] <= val && vec[high] >= val using a binary search. The input array `vec` has to be monotonically increasing. -Code credit: https://computersciencehub.io/julia/code-for-binary-search-algorithm-julia +Code credit: https://gist.github.com/cuongld2/8e4fed9ba44ea2b4598f90e7d5b6c612/155f9cb595314c8db3a266c3316889443b068017 """ @inline function index_binary_search(vec, val, array_size) low = 0