/// <summary>
        /// Creates a snapshot of the current state of the performance counter.
        /// </summary>
        /// <returns>Newly created snapshot.</returns>
        public CachePerformanceSnapshot Snapshot()
        {
            var snap = new CachePerformanceSnapshot(this.missCount, this.hitCount, this.missCountCache, this.hitCountCache, this.utxoSkipDisk)
            {
                Start = this.Start,
                // TODO: Would it not be better for these two guys to be part of the constructor? Either implicitly or explicitly.
                Taken = this.dateTimeProvider.GetUtcNow()
            };

            return(snap);
        }
        private void AddBenchStats(StringBuilder log)
        {
            log.AppendLine("======CachedCoinView Bench======");
            DateTime now       = this.dateTimeProvider.GetUtcNow();
            var      lastFlush = (now - this.lastCacheFlushTime).TotalMinutes;

            log.AppendLine("Last flush ".PadRight(20) + Math.Round(lastFlush, 2) + " min ago (flush every " + TimeSpan.FromSeconds(this.CacheFlushTimeIntervalSeconds).TotalMinutes + " min)");

            log.AppendLine("Coin cache tip ".PadRight(20) + this.blockHash.Height);
            log.AppendLine("Coin store tip ".PadRight(20) + this.innerBlockHash.Height);
            log.AppendLine("block store tip ".PadRight(20) + "tbd");
            log.AppendLine();

            log.AppendLine("Cache entries ".PadRight(20) + this.cacheCount + " items");
            log.AppendLine("Dirty cache entries ".PadRight(20) + this.dirtyCacheCount + " items");

            log.AppendLine("Rewind data entries ".PadRight(20) + this.rewindDataCount + " items");
            var    cache            = this.cacheSizeBytes;
            var    rewind           = this.rewindDataSizeBytes;
            double filledPercentage = Math.Round(((cache + rewind) / (double)this.MaxCacheSizeBytes) * 100, 2);

            log.AppendLine("Cache size".PadRight(20) + cache.BytesToMegaBytes() + " MB");
            log.AppendLine("Rewind data size".PadRight(20) + rewind.BytesToMegaBytes() + " MB");
            log.AppendLine("Total cache size".PadRight(20) + (cache + rewind).BytesToMegaBytes() + " MB / " + this.consensusSettings.MaxCoindbCacheInMB + " MB (" + filledPercentage + "%)");

            CachePerformanceSnapshot snapShot = this.performanceCounter.Snapshot();

            if (this.latestPerformanceSnapShot == null)
            {
                log.AppendLine(snapShot.ToString());
            }
            else
            {
                log.AppendLine((snapShot - this.latestPerformanceSnapShot).ToString());
            }

            this.latestPerformanceSnapShot = snapShot;
        }