我正在用C ++实现 FineList 和 LazyList 类。上面的两个并发链接列表都已在《 多处理器编程的艺术》一书中用Java实现。我想衡量每个算法在整个执行过程中消耗的内存量。我不确定该怎么做。我可以跟踪两种算法中每个线程在计数器中调用“ 新”的次数,并将其用作度量标准。同样,每当线程调用“ 删除”时,我都会减少计数器的数量。这是衡量内存消耗的公平标准吗?问题在于,FineList算法具有基于锁的性质,一旦将其从链表中删除,我就可以立即“删除”该节点。但LazyList算法不是这种情况,因为它具有无锁方法。还有其他方法可以测量内存消耗吗?或者上述方法对两种算法都公平吗?
答案 0 :(得分:1)
如果您保留了new
和delete
调用的有序日志(包括请求的大小),并且您确定您感兴趣的代码仅使用new
和{{1 }}(而不是其他分配例程),您可以在任何时间点通过释放已分配的内存上的剩余内存的运行计数来确定理论的内存消耗。您也许可以通过重载全局delete
以及删除来生成这样的日志。
由于以下几个因素,该数字仅为理论:
那只是在刮擦表面。
答案 1 :(得分:0)
C ++允许您提供自己的operator new
和匹配的operator delete
。这对于此类测量任务很有用。您甚至可以使用它来计算根据分配策略使用的内存,例如查看将分配舍入到16字节的倍数时算法需要多少内存。
此方法的最大好处是您无需触摸算法本身的代码。您可以使用自己的分配器记账。
请记住,如果您确实需要new
,那么无锁编程的想法可能会过于乐观。在C ++中,不能保证new
是无锁的。而且由于C ++允许您在一个线程中new
和在另一线程delete
中进行内存,所以需要一些跨线程同步。