如何区分CPU和内存瓶颈?
How to distinguish between a CPU and a memory bottleneck?
我想过滤一些数据(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
来了解它如何详细地分析您的机器和系统的性能。
- 将字符串存储在c++中的稳定内存中
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- Win32编译器选项和内存分配
- 当vector是tje全局变量时,c++中vector的内存管理
- 带内存和隔离功能的SQLite
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 迭代时从向量和内存中删除对象
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 函数何时会在c++中包含stack_Unwind_Resume调用
- 在C++中释放内存期间,迭代器与指针有何不同
- 无论代码长度如何,以下代码的内存要求有何不同?
- 按引用传递和动态内存分配之间的区别是什么
- C++ 友元函数在内存位置上有何不同?
- 对象Mat(args)之间的区别是什么——内存分配明智;Object*Mat=新Mat(args);在C++中
- "acquire" 和"consume"内存顺序有何不同,何时"consume"可取?
- 在没有 new 关键字的情况下初始化C++对象的内存从何而来
- C++中内存泄漏本身存在多长时间,以及等效的Java程序有何不同
- 将较小的数据块合并到一个较大的内存区中
- 通过new分配内存和分配器分配内存之间的区别是什么
- 初始化数组与错置内存有何不同?