gpt4 book ai didi

c++ - 如何实现高效的C++运行时统计

转载 作者:IT王子 更新时间:2023-10-29 00:01:04 25 4
gpt4 key购买 nike

我想知道是否有监控我的应用程序内部的好方法,最好是现有库的形式。

我的应用程序是大量多线程的,并使用消息传递系统在线程之间进行通信并与外部世界进行通信。我的目标是监控发送的消息类型、频率等。

还可能有其他更通用的统计数据,例如每分钟产生多少线程,调用了多少 new/delete,或应用程序的更具体方面;随你便。

如果您拥有 Google Chrome 浏览器的“内部页面”,那就太棒了,例如 net或 chrome://tracing ,但以命令行方式。

如果有一个足够通用的库来适应我的应用程序的特殊性,那就太好了。
否则我准备实现一个小类来完成这项工作,但我不知道从哪里开始。我认为最重要的是代码不应该干扰太多,这样性能才不会受到影响。

你们对这件事有什么建议吗?

编辑:我的应用程序在 Linux 上运行,在嵌入式环境中,遗憾的是 Valgrind 不支持 :(

最佳答案

我建议在您的代码中维护递增的计数器。计数器可以是 static 类成员或全局变量。如果您使用一个类来定义您的计数器,您可以让构造函数将您的计数器连同一个名称一起注册到一个存储库。然后,您可以通过查阅存储库来查询和重置计数器。

struct Counter {
unsigned long c_;
unsigned long operator++ () { return ++c_; }
operator unsigned long () const { return c_; }
void reset () { unsigned long c = c_; ATOMIC_DECREMENT(c_, c); }
Counter (std::string name);
};

struct CounterAtomic : public Counter {
unsigned long operator++ () { return ATOMIC_INCREMENT(c_, 1); }
CounterAtomic (std::string name) : Counter(name) {}
};

ATOMIC_INCREMENT 将是一种特定于平台的机制,以原子方式递增计数器。 GCC 为此提供了一个内置的 __sync_add_and_fetchATOMIC_DECREMENT类似,GCC内置了__sync_sub_and_fetch

struct CounterRepository {
typedef std::map<std::string, Counter *> MapType;
mutable Mutex lock_;
MapType map_;
void add (std::string n, Counter &c) {
ScopedLock<Mutex> sl(lock_);
if (map_.find(n) != map_.end()) throw n;
map_[n] = &c;
}
Counter & get (std::string n) const {
ScopedLock<Mutex> sl(lock_);
MapType::const_iterator i = map_.find(n);
if (i == map_.end()) throw n;
return *(i->second);
}
};

CounterRepository counterRepository;

Counter::Counter (std::string name) {
counterRepository.add(name, *this);
}

如果您知道同一计数器将由多个线程递增,则使用 CounterAtomic。对于特定于线程的计数器,只需使用 Counter

关于c++ - 如何实现高效的C++运行时统计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11365351/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com