如何区分 CPU 和内存瓶颈?

Geo*_*lly 6 c++ memory cpu profiling

我想过滤一些数据(几百 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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


以防万一,该项目是用 Qt 编写的,我使用 Qt Creator 作为想法。平台是Windows。我目前正在使用 Very Sleepy 来分析我的代码。

fjs*_*fjs 1

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

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