Closed. This question is opinion-based。它当前不接受答案。
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            想改善这个问题吗?更新问题,以便editing this post用事实和引用来回答。
                        
                        5年前关闭。
                                                                                            
                
        
假设我的系统具有4GB的RAM,并且某个程序在整个执行过程中仅消耗100 MB的内存,并且还运行有限的时间,例如仅30秒。您不认为在执行程序期间完全不分配内存(通过提高性能)是个好主意吗?该程序终止后,仍将释放这100 MB。

最佳答案

在短期运行的程序中分配内存最重要的部分是促进内存重用。您的处理器的缓存有限,可能只有几个MB,并且如果您连续分配更多的内存,您将永远无法利用它。

但是,如果您先释放一些内存,然后重新分配并重用它,则很有可能在重用时该内存将已经“热”并驻留在缓存中。这意味着您不会招致缓存未命中的损失,并且您的程序将运行得更快。

当然,您需要权衡高速缓存未命中的释放/重新分配成本,但是可以保证不断分配越来越多的内存会导致最低级别的高速缓存未命中。这些高速缓存中的每一个在现代处理器上的未命中成本约为100条指令,远低于分配/取消分配的成本。

编辑

因此,我编写了一些测试程序来对此进行测试。

#include <stdio.h>
#include <stdlib.h>

process1(){
    char * ptr = malloc(1 << 20);
    int i = 0;
    while (i < (1<<20)) ptr[i++] = rand();
    free(ptr);
}

process2(){
    char * ptr = malloc(1 << 20);
    int i = 0;
    while (i < (1<<20)) ptr[i++] = rand();
}


main(){
    int i = 100;
    while(i--) process1();
    i = 100;
    while(i--) process2();
}


这两个进程都会读取100 MB的数据,第一个进程会立即对其进行分配,而第二个进程则不会。我使用valgrind的cachegrind工具对此进行了分析。这是结果

fn=process1
0 943720200 2 2 419430900 100 0 209715800 1638400 32767
fn=process2
0 943719900 0 0 419430800 100 0 209715700 1638400 1605784


好吧,那不令人兴奋,我会翻译。通过避免这种免费操作,您节省了不到0.1%的指令周期,并且导致了大约一百万个半个LL缓存未命中。如果我们使用标准周期估计公式CEst = lr + 10 Llm + 100 LLm,则仅避免函数中的自由就意味着性能下降约16%。

我重试了callgrind以获得完整的故事(我不会发布详细的结果,因为它们比缓存研磨的结果复杂得多),但是当我们包含释放全部结果的调用时,结果是相同的,多出16%不打免费电话时,会使用循环。

可以在自己的程序上随意进行相同的测试,但是在这种情况下,结果很清楚。与使用新内存连续刷新缓存的成本相比,管理动态内存的成本确实微不足道。

另外,我没有提到这一点,但是应该直接进行比较的是免费的成本与缓存未命中的成本。释放的总时间为38930个周期,缓存未命中157332000个,节省了39 000个周期,并为此付出了1.5亿美元的代价。

关于c++ - 您认为不为小程序分配内存是个好主意吗? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24020841/

10-11 22:06
查看更多