c++ 如何区分CPU和内存瓶颈?

fdx2calv  于 2022-12-15  发布在  其他
关注(0)|答案(1)|浏览(133)

我想过滤一些数据(数百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来分析我的代码。

gmxoilav

gmxoilav1#

Intel vTune是一款免费的图形工具,适用于所有Windows、Linux和macOS。如果你想要简单易行的设置和阅读,并且你使用的是Intel CPU,我认为vTune是一个不错的选择。它可以自动为你提供瓶颈所在的建议(内核与内存)。
我相信英特尔VTune在其内部收集了大量PMU(性能监控单元)计数器值、LBR、堆栈信息等。在Linux上,我们非常欢迎您使用Linux Perf工具来收集自己的性能统计信息。例如,同时使用perf record + perf report可以告诉您应用程序的热点。但如果您关心其他指标,例如缓存未命中行为,您必须明确告诉perf要收集哪个性能计数器。perf mem能够满足部分需求。但毕竟,Linux Perf比图形化Intel VTune更“硬核”,如果你想充分利用LinuxPerf,你最好知道要寻找什么样的计数器值--有时候一个计数器会直接给予你想要收集的度量,其他时候你必须对几个计数器值做一些计算来得到你想要的指标。使用perf list来了解它能多么详细地描述你的机器和系统的性能。

相关问题