From 2293936806b9900eb6ab535fe4b3b2f705ad46e4 Mon Sep 17 00:00:00 2001
From: Sam Yates <halfflat@gmail.com>
Date: Mon, 3 Feb 2020 11:58:37 +0100
Subject: [PATCH] Replace unnecessary cv_policy copy in fvm_discretize. (#950)

Also: add a couple more cases to fvm_discretize ubench.
---
 arbor/fvm_layout.cpp           |  7 ++++---
 test/ubench/fvm_discretize.cpp | 29 +++++++++++++++++++++++++++++
 2 files changed, 33 insertions(+), 3 deletions(-)

diff --git a/arbor/fvm_layout.cpp b/arbor/fvm_layout.cpp
index 9ca781a2..1d5415c7 100644
--- a/arbor/fvm_layout.cpp
+++ b/arbor/fvm_layout.cpp
@@ -351,9 +351,10 @@ fvm_cv_discretization fvm_cv_discretize(const cable_cell& cell, const cable_cell
     const auto& dflt = cell.default_parameters;
     fvm_cv_discretization D;
 
-    cv_policy pol = (dflt.discretization | global_dflt.discretization).value_or(default_cv_policy());
-    locset cv_ends = pol.cv_boundary_points(cell);
-    D.geometry = cv_geometry_from_ends(cell, cv_ends);
+    D.geometry = cv_geometry_from_ends(cell,
+        dflt.discretization? dflt.discretization->cv_boundary_points(cell):
+        global_dflt.discretization? global_dflt.discretization->cv_boundary_points(cell):
+        default_cv_policy().cv_boundary_points(cell));
 
     if (D.geometry.empty()) return D;
 
diff --git a/test/ubench/fvm_discretize.cpp b/test/ubench/fvm_discretize.cpp
index 42a39b05..0c826373 100644
--- a/test/ubench/fvm_discretize.cpp
+++ b/test/ubench/fvm_discretize.cpp
@@ -50,6 +50,19 @@ void run_cv_geom_every_sample(benchmark::State& state) {
     }
 }
 
+void run_cv_geom_explicit(benchmark::State& state) {
+    auto gdflt = neuron_parameter_defaults;
+
+    cable_cell c(from_swc(SWCFILE));
+
+    while (state.KeepRunning()) {
+        auto ends = cv_policy_every_sample().cv_boundary_points(c);
+        auto ends2 = cv_policy_explicit(std::move(ends)).cv_boundary_points(c);
+
+        benchmark::DoNotOptimize(cv_geometry_from_ends(c, ends2));
+    }
+}
+
 void run_discretize(benchmark::State& state) {
     auto gdflt = neuron_parameter_defaults;
     const std::size_t ncv_per_branch = state.range(0);
@@ -73,10 +86,26 @@ void run_discretize_every_sample(benchmark::State& state) {
     }
 }
 
+void run_discretize_explicit(benchmark::State& state) {
+    auto gdflt = neuron_parameter_defaults;
+
+    cable_cell c(from_swc(SWCFILE));
+
+    while (state.KeepRunning()) {
+        auto ends = cv_policy_every_sample().cv_boundary_points(c);
+        c.default_parameters.discretization = cv_policy_explicit(std::move(ends));
+
+        benchmark::DoNotOptimize(fvm_cv_discretize(c, gdflt));
+    }
+}
+
 BENCHMARK(run_cv_geom)->RangeMultiplier(2)->Range(1,32)->Unit(benchmark::kMicrosecond);
 BENCHMARK(run_discretize)->RangeMultiplier(2)->Range(1,32)->Unit(benchmark::kMicrosecond);
 
 BENCHMARK(run_cv_geom_every_sample)->Unit(benchmark::kMillisecond);
 BENCHMARK(run_discretize_every_sample)->Unit(benchmark::kMillisecond);
 
+BENCHMARK(run_cv_geom_explicit)->Unit(benchmark::kMillisecond);
+BENCHMARK(run_discretize_explicit)->Unit(benchmark::kMillisecond);
+
 BENCHMARK_MAIN();
-- 
GitLab