diff --git a/db/perf_context_test.cc b/db/perf_context_test.cc index 9494ac92b..8a345e5bb 100644 --- a/db/perf_context_test.cc +++ b/db/perf_context_test.cc @@ -589,6 +589,19 @@ TEST_F(PerfContextTest, FalseDBMutexWait) { } } } + +TEST_F(PerfContextTest, ToString) { + perf_context.Reset(); + perf_context.block_read_count = 12345; + + std::string zero_included = perf_context.ToString(); + ASSERT_NE(std::string::npos, zero_included.find("= 0")); + ASSERT_NE(std::string::npos, zero_included.find("= 12345")); + + std::string zero_excluded = perf_context.ToString(true); + ASSERT_EQ(std::string::npos, zero_excluded.find("= 0")); + ASSERT_NE(std::string::npos, zero_excluded.find("= 12345")); +} } int main(int argc, char** argv) { diff --git a/include/rocksdb/perf_context.h b/include/rocksdb/perf_context.h index c2af729e3..7a6b6f367 100644 --- a/include/rocksdb/perf_context.h +++ b/include/rocksdb/perf_context.h @@ -21,7 +21,7 @@ struct PerfContext { void Reset(); // reset all performance counters to zero - std::string ToString() const; + std::string ToString(bool exclude_zero_counters = false) const; uint64_t user_key_comparison_count; // total number of user key comparisons uint64_t block_cache_hit_count; // total number of block cache hits diff --git a/util/perf_context.cc b/util/perf_context.cc index 282516590..07bad40f2 100644 --- a/util/perf_context.cc +++ b/util/perf_context.cc @@ -61,32 +61,54 @@ void PerfContext::Reset() { #endif } -#define OUTPUT(counter) #counter << " = " << counter << ", " +#define OUTPUT(counter) \ + if (!exclude_zero_counters || (counter > 0)) { \ + ss << #counter << " = " << counter << ", "; \ + } -std::string PerfContext::ToString() const { +std::string PerfContext::ToString(bool exclude_zero_counters) const { #if defined(NPERF_CONTEXT) || defined(IOS_CROSS_COMPILE) return ""; #else std::ostringstream ss; - ss << OUTPUT(user_key_comparison_count) << OUTPUT(block_cache_hit_count) - << OUTPUT(block_read_count) << OUTPUT(block_read_byte) - << OUTPUT(block_read_time) << OUTPUT(block_checksum_time) - << OUTPUT(block_decompress_time) << OUTPUT(internal_key_skipped_count) - << OUTPUT(internal_delete_skipped_count) << OUTPUT(write_wal_time) - << OUTPUT(get_snapshot_time) << OUTPUT(get_from_memtable_time) - << OUTPUT(get_from_memtable_count) << OUTPUT(get_post_process_time) - << OUTPUT(get_from_output_files_time) << OUTPUT(seek_on_memtable_time) - << OUTPUT(seek_on_memtable_count) << OUTPUT(seek_child_seek_time) - << OUTPUT(seek_child_seek_count) << OUTPUT(seek_min_heap_time) - << OUTPUT(seek_internal_seek_time) << OUTPUT(find_next_user_entry_time) - << OUTPUT(write_pre_and_post_process_time) << OUTPUT(write_memtable_time) - << OUTPUT(db_mutex_lock_nanos) << OUTPUT(db_condition_wait_nanos) - << OUTPUT(merge_operator_time_nanos) << OUTPUT(write_delay_time) - << OUTPUT(read_index_block_nanos) << OUTPUT(read_filter_block_nanos) - << OUTPUT(new_table_block_iter_nanos) << OUTPUT(new_table_iterator_nanos) - << OUTPUT(block_seek_nanos) << OUTPUT(find_table_nanos) - << OUTPUT(bloom_memtable_hit_count) << OUTPUT(bloom_memtable_miss_count) - << OUTPUT(bloom_sst_hit_count) << OUTPUT(bloom_sst_miss_count); + OUTPUT(user_key_comparison_count); + OUTPUT(block_cache_hit_count); + OUTPUT(block_read_count); + OUTPUT(block_read_byte); + OUTPUT(block_read_time); + OUTPUT(block_checksum_time); + OUTPUT(block_decompress_time); + OUTPUT(internal_key_skipped_count); + OUTPUT(internal_delete_skipped_count); + OUTPUT(write_wal_time); + OUTPUT(get_snapshot_time); + OUTPUT(get_from_memtable_time); + OUTPUT(get_from_memtable_count); + OUTPUT(get_post_process_time); + OUTPUT(get_from_output_files_time); + OUTPUT(seek_on_memtable_time); + OUTPUT(seek_on_memtable_count); + OUTPUT(seek_child_seek_time); + OUTPUT(seek_child_seek_count); + OUTPUT(seek_min_heap_time); + OUTPUT(seek_internal_seek_time); + OUTPUT(find_next_user_entry_time); + OUTPUT(write_pre_and_post_process_time); + OUTPUT(write_memtable_time); + OUTPUT(db_mutex_lock_nanos); + OUTPUT(db_condition_wait_nanos); + OUTPUT(merge_operator_time_nanos); + OUTPUT(write_delay_time); + OUTPUT(read_index_block_nanos); + OUTPUT(read_filter_block_nanos); + OUTPUT(new_table_block_iter_nanos); + OUTPUT(new_table_iterator_nanos); + OUTPUT(block_seek_nanos); + OUTPUT(find_table_nanos); + OUTPUT(bloom_memtable_hit_count); + OUTPUT(bloom_memtable_miss_count); + OUTPUT(bloom_sst_hit_count); + OUTPUT(bloom_sst_miss_count); return ss.str(); #endif }