chromium之histogram.h

histogram不知道是干啥的

// Histogram is an object that aggregates statistics, and can summarize them in
// various forms, including ASCII graphical, HTML, and numerically (as a
// vector of numbers corresponding to each of the aggregating buckets).

google翻译

//直方图是汇总统计信息的对象,可以将它们汇总
//各种形式,包括ASCII图形,HTML和数字(如
//每个聚合桶对应的数字向量)。

 直方图——不就是统计用的,PPT还有饼图什么的


 

不管了,看看怎么实现的,就知道是干嘛用的了。

瞄一下,有没有引用不认识的头文件

histogram.cc

#include "base/histogram.h"

#include <math.h>
#include <string>

#include "base/logging.h"
#include "base/pickle.h"
#include "base/string_util.h"

有一个!

#include "base/pickle.h"

参见分析chromium之pickle,我们知道该类提供基本的二进制打包、解包的功能。这样代码就能继续看下去了

这个pickle在头文件里有用到

    bool Serialize(Pickle* pickle) const;
    bool Deserialize(void** iter, const Pickle& pickle);

序列化一般是进程间通讯传递数据用的

序列化在什么时候用:

当你想把的内存中的对象状态保存到一个文件中或者数据库中时候;
当你想用套接字在网络上传送对象的时候;
当你想通过RMI传输对象的时候;

 

一个类,有没有掌握——给你头文件,你会不会使用里面的函数——会了,这个类你就懂了。

class Pickle;

class Histogram {
 public:
//----------------------------------------------------------------------------
  // Statistic values, developed over the life of the histogram.

  class SampleSet {
   public:
    explicit SampleSet();
    // Adjust size of counts_ for use with given histogram.
    void Resize(const Histogram& histogram);
    void CheckSize(const Histogram& histogram) const;

    // Accessor for histogram to make routine additions.
    void Accumulate(Sample value, Count count, size_t index);

    // Accessor methods.
    Count counts(size_t i) const { return counts_[i]; }
    Count TotalCount() const;
    int64 sum() const { return sum_; }
    int64 square_sum() const { return square_sum_; }

    // Arithmetic manipulation of corresponding elements of the set.
    void Add(const SampleSet& other);
    void Subtract(const SampleSet& other);

    bool Serialize(Pickle* pickle) const;
    bool Deserialize(void** iter, const Pickle& pickle);

   protected:
    // Actual histogram data is stored in buckets, showing the count of values
    // that fit into each bucket.
    Counts counts_;

    // Save simple stats locally.  Note that this MIGHT get done in base class
    // without shared memory at some point.
    int64 sum_;         // sum of samples.
    int64 square_sum_;  // sum of squares of samples.
  };
  //----------------------------------------------------------------------------

  Histogram(const char* name, Sample minimum,
            Sample maximum, size_t bucket_count);
  Histogram(const char* name, base::TimeDelta minimum,
            base::TimeDelta maximum, size_t bucket_count);
  virtual ~Histogram();

  void Add(int value);
  // Accept a TimeDelta to increment.
  void AddTime(base::TimeDelta time) {
    Add(static_cast<int>(time.InMilliseconds()));
  }

  void AddSampleSet(const SampleSet& sample);

  // The following methods provide graphical histogram displays.
  void WriteHTMLGraph(std::string* output) const;
  void WriteAscii(bool graph_it, const std::string& newline,
                  std::string* output) const;

  // Support generic flagging of Histograms.
  // 0x1 Currently used to mark this histogram to be recorded by UMA..
  // 0x8000 means print ranges in hex.
  void SetFlags(int flags) { flags_ |= flags; }
  void ClearFlags(int flags) { flags_ &= ~flags; }
  int flags() const { return flags_; }

  virtual BucketLayout histogram_type() const { return EXPONENTIAL; }

  // Convenience methods for serializing/deserializing the histograms.
  // Histograms from Renderer process are serialized and sent to the browser.
  // Browser process reconstructs the histogram from the pickled version
  // accumulates the browser-side shadow copy of histograms (that mirror
  // histograms created in the renderer).

  // Serialize the given snapshot of a Histogram into a String. Uses
  // Pickle class to flatten the object.
  static std::string SerializeHistogramInfo(const Histogram& histogram,
                                            const SampleSet& snapshot);
  // The following method accepts a list of pickled histograms and
  // builds a histogram and updates shadow copy of histogram data in the
  // browser process.
  static bool DeserializeHistogramInfo(const std::string& histogram_info);


  //----------------------------------------------------------------------------
  // Accessors for serialization and testing.
  //----------------------------------------------------------------------------
  const std::string histogram_name() const { return histogram_name_; }
  Sample declared_min() const { return declared_min_; }
  Sample declared_max() const { return declared_max_; }
  virtual Sample ranges(size_t i) const { return ranges_[i];}
  virtual size_t bucket_count() const { return bucket_count_; }
  // Snapshot the current complete set of sample data.
  // Override with atomic/locked snapshot if needed.
  virtual void SnapshotSample(SampleSet* sample) const;
  // ...
}

 

看一下测试用例

// Check for basic syntax and use.
TEST(HistogramTest, StartupShutdownTest) {
  // Try basic construction
  Histogram histogram("TestHistogram", 1, 1000, 10);
  Histogram histogram1("Test1Histogram", 1, 1000, 10);

  LinearHistogram linear_histogram("TestLinearHistogram", 1, 1000, 10);
  LinearHistogram linear_histogram1("Test1LinearHistogram", 1, 1000, 10);

  // Use standard macros (but with fixed samples)
  HISTOGRAM_TIMES("Test2Histogram", TimeDelta::FromDays(1));
  HISTOGRAM_COUNTS("Test3Histogram", 30);

  DHISTOGRAM_TIMES("Test4Histogram", TimeDelta::FromDays(1));
  DHISTOGRAM_COUNTS("Test5Histogram", 30);

  ASSET_HISTOGRAM_COUNTS("Test6Histogram", 129);

  // Try to construct samples.
  Histogram::SampleSet sample1;
  Histogram::SampleSet sample2;

  // Use copy constructor of SampleSet
  sample1 = sample2;
  Histogram::SampleSet sample3(sample1);

  // Finally test a statistics recorder, without really using it.
  StatisticsRecorder recorder;
}

 

看一下效果,浏览器地址栏输入:chrome://histograms/

 

posted on 2018-05-13 16:38  ckelsel  阅读(562)  评论(0编辑  收藏  举报

导航