如何区分CPU和内存瓶颈?

How to distinguish between a CPU and a memory bottleneck?

本文关键字:内存 何区 CPU      更新时间:2023-10-16

我想过滤一些数据(100 MB 到几 GB(。用户可以更改过滤器,因此我必须经常重新过滤数据。

代码相当简单:

std::vector<Event*> filteredEvents;
for (size_t i = 0; i < events.size(); i++){
const auto ev = events[i];
for (const auto& filter : filters) {
if (filter->evaluate(ev)) {
filteredEvents->push_back(ev);
break;
}
}
if (i % 512 == 0) {
updateProgress(i);
}
}

我现在想添加另一个过滤器。我可以通过使用更多 CPU 或使用更多内存的方式来做到这一点。为了在两者之间做出决定,我想知道上述循环的瓶颈是什么。

如何分析代码以确定瓶颈是 CPU 还是内存?


如果重要的话,这个项目是用Qt编写的,我使用Qt Creator作为想法。该平台是Windows。我目前正在使用Very Sleepy来分析我的代码。

Intel vTune 是一款免费的图形工具,适用于所有 Windows 和 Linux 以及 macOS。如果你想要一些易于设置、简单易读的东西,并且你使用的是英特尔CPU,我会说vTune是一个不错的选择。它可以自动为您提供有关瓶颈位置(核心与内存(的建议。

在幕后,我相信英特尔vTune正在收集一堆PMU(性能监控单元(计数器值,LBR,堆栈信息等。在 Linux 上,非常欢迎您使用 Linux Perf 工具并为自己收集性能统计信息。例如,串联使用perf record+perf report可以告诉您应用程序的热点。但是,如果您担心其他指标(例如缓存未命中行为(,则必须明确告知perf要收集的性能计数器。perf mem能够满足其中的一些需求。但毕竟,Linux Perf 比图形化的 Intel vTune 更"硬核",如果您想充分利用 Linux Perf,您最好知道要查找哪些计数器值 - 有时一个计数器会直接为您提供要收集的指标,其他时候您必须对多个计数器值进行一些计算才能获得所需的指标。使用perf list来了解它如何详细地分析您的机器和系统的性能。