# HG changeset patch # User Chris Cannam # Date 1485439880 0 # Node ID fad8f533ca13a121c90e4131dd9bee7c66f6b186 # Parent 54fabf5aceb896f2166b4fbe4f742db2a0b9008e Reduce amount of copying in FFTModel diff -r 54fabf5aceb8 -r fad8f533ca13 data/model/FFTModel.cpp --- a/data/model/FFTModel.cpp Fri Jan 20 18:05:41 2017 +0000 +++ b/data/model/FFTModel.cpp Thu Jan 26 14:11:20 2017 +0000 @@ -44,8 +44,13 @@ m_fftSize(fftSize), m_windower(windowType, windowSize), m_fft(fftSize), + m_cacheWriteIndex(0), m_cacheSize(3) { + while (m_cached.size() < m_cacheSize) { + m_cached.push_back({ -1, cvec(m_fftSize / 2 + 1) }); + } + if (m_windowSize > m_fftSize) { cerr << "ERROR: FFTModel::FFTModel: window size (" << m_windowSize << ") must be at least FFT size (" << m_fftSize << ")" << endl; @@ -296,7 +301,7 @@ return data; } -FFTModel::cvec +const FFTModel::cvec & FFTModel::getFFTColumn(int n) const { // The small cache (i.e. the m_cached deque) is for cases where @@ -319,16 +324,14 @@ m_windower.cut(samples.data()); breakfastquay::v_fftshift(samples.data(), m_fftSize); - cvec col(m_fftSize/2 + 1); + cvec &col = m_cached[m_cacheWriteIndex].col; m_fft.forwardInterleaved(samples.data(), reinterpret_cast(col.data())); - SavedColumn sc { n, col }; - if (m_cached.size() >= m_cacheSize) { - m_cached.pop_front(); - } - m_cached.push_back(sc); + m_cached[m_cacheWriteIndex].n = n; + + m_cacheWriteIndex = (m_cacheWriteIndex + 1) % m_cacheSize; return col; } diff -r 54fabf5aceb8 -r fad8f533ca13 data/model/FFTModel.h --- a/data/model/FFTModel.h Fri Jan 20 18:05:41 2017 +0000 +++ b/data/model/FFTModel.h Thu Jan 26 14:11:20 2017 +0000 @@ -27,7 +27,6 @@ #include #include #include -#include /** * An implementation of DenseThreeDimensionalModel that makes FFT data @@ -172,7 +171,7 @@ typedef std::vector, breakfastquay::StlAllocator>> cvec; - cvec getFFTColumn(int column) const; + const cvec &getFFTColumn(int column) const; // returns ref for immediate use only fvec getSourceSamples(int column) const; fvec getSourceData(std::pair) const; fvec getSourceDataUncached(std::pair) const; @@ -182,12 +181,13 @@ fvec data; }; mutable SavedSourceData m_savedData; - + struct SavedColumn { int n; cvec col; }; - mutable std::deque m_cached; + mutable std::vector m_cached; + mutable size_t m_cacheWriteIndex; size_t m_cacheSize; };