在C+中对数组的写入速度慢+; 我只是想知道这是否是C++中的预期行为。以下代码的运行速度约为0.001毫秒: for(int l=0;l<100000;l++){ int total=0; for( int i = 0; i < num_elements; i++) { total+=i; } } for(int l=0;l

在C+中对数组的写入速度慢+; 我只是想知道这是否是C++中的预期行为。以下代码的运行速度约为0.001毫秒: for(int l=0;l<100000;l++){ int total=0; for( int i = 0; i < num_elements; i++) { total+=i; } } for(int l=0;l,c++,optimization,C++,Optimization,在第一种情况下,编译器似乎正在完全优化该循环 循环的总体效果是不可操作的,因此编译器只是删除它。我怀疑您看到的是分页的效果,可能是分页的效果。malloc调用将分配一个大小合适的内存块,该内存块可能由多个虚拟页表示。每个页都链接到进程内存separ中当然 根据循环计时的方式,您可能还正在测量调用malloc的成本。在任何一种情况下,性能都会对编译器优化选项、线程选项、编译器版本、运行时版本以及其他任何内容非常敏感。您不能安全地假设成本与分配的大小。您唯一能做的就是测量它,并找出如何在证明它是一个

在第一种情况下,编译器似乎正在完全优化该循环


循环的总体效果是不可操作的,因此编译器只是删除它。

我怀疑您看到的是分页的效果,可能是分页的效果。
malloc
调用将分配一个大小合适的内存块,该内存块可能由多个虚拟页表示。每个页都链接到进程内存separ中当然


根据循环计时的方式,您可能还正在测量调用
malloc
的成本。在任何一种情况下,性能都会对编译器优化选项、线程选项、编译器版本、运行时版本以及其他任何内容非常敏感。您不能安全地假设成本与分配的大小。您唯一能做的就是测量它,并找出如何在证明它是一个问题后进行最佳优化。

第一个示例可以仅使用CPU寄存器来实现。这些寄存器每秒可以访问数十亿次。第二个示例使用的内存太多,它肯定会溢出L1,甚至可能会溢出L1二级缓存(取决于CPU型号)。这会更慢。不过,15毫秒/100.000次写入的速度会达到每次写入1.5纳秒-有效频率为667兆赫。这并不慢。

非常简单。 在第一种情况下,您只有3个变量,可以轻松地存储在GPR(通用寄存器)中,但这并不意味着它们始终存在,但它们可能位于一级缓存内存中,这意味着可以非常快速地访问它们


在第二种情况下,您有超过100k个变量,并且您需要大约400kB来存储它们。这对于寄存器和一级缓存内存来说是非常有限的。在最好的情况下,它可能在二级缓存内存中,但可能不是所有的变量都在二级缓存中。如果寄存器中没有某个变量,L1,L2(我假设您的处理器没有三级缓存)这意味着您需要在RAM中搜索它,这需要更多的时间。

aha!我也这么想,有没有办法禁用此优化以进行基准测试?这在很大程度上取决于您使用的编译器和IDE。检查帮助文件/手册页以了解禁用优化所需的操作。尝试在循环后使用total;如果您使用的是gcc,则添加-O0。最后打印出来,或者将其转换为函数并从function@ux9i打印是因为它自己的性能问题,因为I/O操作非常慢。这是一种很差的方法来判断事物。你的问题是C,但是你的标签是C++。哪一个是C++?对不起,严格的C++。+但是如果int声明被移到for循环之外,那么C@Laurence-不,你的代码在C99中是完全标准的,大多数C89编译器都会接受你使用的语法。如果这是C++,为什么你不使用<代码>矢量< /代码>?BTW:<代码> int =((NuthObjyStudioNoMyStudio)-NUMIX元素)/2;-甚至更快。+1用于指出cpu寄存器。在第二种情况下,代码在内存中单步执行,写入字节(拉入内存页,强制缓存刷新,…然后只写入一个值)。在前一种情况下,它可以很容易地成为纯L1。此响应应该更高。
int *values=(int*)malloc(sizeof(int)*100000);
        for(int l=0;l<100000;l++){
            int total=0;
            for( unsigned int i = 0; i < num_elements; i++) 
            {
                total+=i;
            }
            values[l]=total;
        }