// Version: $Id: d8eb84dcbaa7722b22e54e6f366222bd105b9167 $ // // // Commentary: // // // Change Log: // // // Code: #pragma once #include #include template class dtkDistributedArray; // /////////////////////////////////////////////////////////////////// // dtkDistributedArrayCache // /////////////////////////////////////////////////////////////////// template class dtkDistributedArrayCache { typedef dtkDistributedArray DSArray; public: typedef QVarLengthArray Array; public: dtkDistributedArrayCache(DSArray *array); virtual ~dtkDistributedArrayCache(void) {} public: void clear(void); void enable(void); void disable(void); const T& value(const qlonglong& entry_id, const qint32& owner); double hitrate(void); private: Array lines[Length]; qlonglong ids[Length]; qlonglong hit; qlonglong miss; int last; bool enabled; //dtkDistributedArray *m_array; DSArray *m_array; }; // /////////////////////////////////////////////////////////////////// #include "dtkDistributedArray.h" template inline dtkDistributedArrayCache::dtkDistributedArrayCache(DSArray *array) : m_array(array) { for (int i = 0; i < Length; ++i) { ids[i] = - Prealloc - 1; lines[i].resize(Prealloc); } hit = 0; miss = 0; last = -1; enabled = true; } template inline void dtkDistributedArrayCache::clear(void) { for (int i = 0; i < Length; ++i) { ids[i] = - Prealloc - 1; lines[i].resize(0); last = -1; lines[i].resize(Prealloc); } } template inline void dtkDistributedArrayCache::disable(void) { enabled = false; } template inline void dtkDistributedArrayCache::enable(void) { enabled = true; } template inline const T& dtkDistributedArrayCache::value(const qlonglong& entry_id, const qint32& owner) { // Check if entry_id is already in the Cache int line_id = -1; if (enabled) { for (int i = 0; i < Length; ++i) { if (entry_id >= ids[i] && entry_id < ids[i] + lines[i].size()) { line_id = i; break; } } } // If not then find an available cache line and store remote values into it if (line_id < 0) { miss++; line_id = (last + 1) % Length; ids[line_id] = entry_id; qlonglong size = Prealloc; m_array->copyIntoArray(entry_id, owner, lines[line_id].data(), size); lines[line_id].resize(size); } else { hit ++; } last = line_id; return lines[line_id].at(entry_id - ids[line_id]); } template inline double dtkDistributedArrayCache::hitrate() { qlonglong sum = miss + hit; qDebug() << "misses:" << miss << "hits:" << hit ; if (sum == 0) return 0; return double(hit) / (double)(sum); } // // dtkDistributedArrayCache.h ends here