我想过滤一些数据(数百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来分析我的代码。
1条答案
按热度按时间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
来了解它能多么详细地描述你的机器和系统的性能。