aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Berthold Stoeger <bstoeger@mail.tuwien.ac.at>2020-05-05 22:24:50 +0200
committerGravatar Robert C. Helling <helling@atdotde.de>2020-05-06 00:22:31 +0200
commit123937901fe9c35fcb1be471fb6ad8a9f89f1b1d (patch)
tree475940d30ac8830063e9053d52b308dfd6cf48b6
parentf37f42876260e804e4e990d608a8dcd21a141ba0 (diff)
downloadsubsurface-123937901fe9c35fcb1be471fb6ad8a9f89f1b1d.tar.gz
planner: remove Bühlmann factor cache
The Bühlmann factors were cached in a thread-safe hashmap. It seemed somewhat dubious that entering a critical section and doing a hash-lookup would be significantly faster than a simple exp() call. Indeed, in a very cache friendly test (16 entries, tight loop) calling the factor() function 32 000 000 times from a different translation units we get: - with cache: 604 ms - without cache: 266 ms Therefore, remove the cache. Given that 32 000 000 calls take only 266 ms, it appears not sensible to try to optimize this function anyway. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
-rw-r--r--core/deco.c26
-rw-r--r--core/qthelper.cpp25
-rw-r--r--core/qthelper.h2
3 files changed, 6 insertions, 47 deletions
diff --git a/core/deco.c b/core/deco.c
index 0dd4051c2..dc93ea265 100644
--- a/core/deco.c
+++ b/core/deco.c
@@ -290,18 +290,10 @@ double tissue_tolerance_calc(struct deco_state *ds, const struct dive *dive, dou
}
/*
- * Return buelman factor for a particular period and tissue index.
- *
- * We cache the factor, since we commonly call this with the
- * same values... We have a special "fixed cache" for the one second
- * case, although I wonder if that's even worth it considering the
- * more general-purpose cache.
+ * Return Buehlmann factor for a particular period and tissue index.
*/
-
-
static double factor(int period_in_seconds, int ci, enum inertgas gas)
{
- double factor;
if (period_in_seconds == 1) {
if (gas == N2)
return buehlmann_N2_factor_expositon_one_second[ci];
@@ -309,17 +301,11 @@ static double factor(int period_in_seconds, int ci, enum inertgas gas)
return buehlmann_He_factor_expositon_one_second[ci];
}
- factor = cache_value(ci, period_in_seconds, gas);
- if (!factor) {
- // ln(2)/60 = 1.155245301e-02
- if (gas == N2)
- factor = 1 - exp(-period_in_seconds * 1.155245301e-02 / buehlmann_N2_t_halflife[ci]);
- else
- factor = 1 - exp(-period_in_seconds * 1.155245301e-02 / buehlmann_He_t_halflife[ci]);
- cache_insert(ci, period_in_seconds, gas, factor);
- }
-
- return factor;
+ // ln(2)/60 = 1.155245301e-02
+ if (gas == N2)
+ return 1.0 - exp(-period_in_seconds * 1.155245301e-02 / buehlmann_N2_t_halflife[ci]);
+ else
+ return 1.0 - exp(-period_in_seconds * 1.155245301e-02 / buehlmann_He_t_halflife[ci]);
}
static double calc_surface_phase(double surface_pressure, double he_pressure, double n2_pressure, double he_time_constant, double n2_time_constant)
diff --git a/core/qthelper.cpp b/core/qthelper.cpp
index bb68afcbc..e543ad1c1 100644
--- a/core/qthelper.cpp
+++ b/core/qthelper.cpp
@@ -1601,31 +1601,6 @@ char *intdup(int index)
return strdup(tmpbuf);
}
-QHash<int, double> factor_cache;
-
-QReadWriteLock factorCacheLock;
-extern "C" double cache_value(int tissue, int timestep, enum inertgas inertgas)
-{
- double value;
- int key = (timestep << 5) + (tissue << 1);
- if (inertgas == HE)
- ++key;
- factorCacheLock.lockForRead();
- value = factor_cache.value(key);
- factorCacheLock.unlock();
- return value;
-}
-
-extern "C" void cache_insert(int tissue, int timestep, enum inertgas inertgas, double value)
-{
- int key = (timestep << 5) + (tissue << 1);
- if (inertgas == HE)
- ++key;
- factorCacheLock.lockForWrite();
- factor_cache.insert(key, value);
- factorCacheLock.unlock();
-}
-
extern "C" void print_qt_versions()
{
printf("%s\n", qPrintable(QStringLiteral("built with Qt Version %1, runtime from Qt Version %2").arg(QT_VERSION_STR).arg(qVersion())));
diff --git a/core/qthelper.h b/core/qthelper.h
index 4a7d8ec52..0f3dd9c1b 100644
--- a/core/qthelper.h
+++ b/core/qthelper.h
@@ -146,8 +146,6 @@ const char *subsurface_user_agent();
enum deco_mode decoMode();
int parse_seabear_header(const char *filename, char **params, int pnr);
char *get_current_date();
-double cache_value(int tissue, int timestep, enum inertgas gas);
-void cache_insert(int tissue, int timestep, enum inertgas gas, double value);
void print_qt_versions();
void lock_planner();
void unlock_planner();