当前位置: 首页 > 知识库问答 >
问题:

memcpy()的速度受malloc()方式的影响很大

姚胡媚
2023-03-14

我编写了一个程序来测试memcpy()的速度。然而,内存的分配方式对速度有很大的影响。

#include<stdlib.h>
#include<stdio.h>
#include<sys/time.h>

void main(int argc, char *argv[]){
    unsigned char * pbuff_1;
    unsigned char * pbuff_2;
    unsigned long iters = 1000*1000;

    int type = atoi(argv[1]);
    int buff_size = atoi(argv[2])*1024;

    if(type == 1){ 
        pbuff_1 = (void *)malloc(2*buff_size);
        pbuff_2 = pbuff_1+buff_size;
    }else{
        pbuff_1 = (void *)malloc(buff_size);
        pbuff_2 = (void *)malloc(buff_size);
    }   

    for(int i = 0; i < iters; ++i){
        memcpy(pbuff_2, pbuff_1, buff_size);
    }   

    if(type == 1){ 
        free(pbuff_1);
    }else{
        free(pbuff_1);
        free(pbuff_2);
    }   
}
real    0m0.128s
user    0m0.120s
sys 0m0.000s
real    0m0.422s
user    0m0.420s
sys 0m0.000s

为什么memcpy()的速度每4KB就会急剧下降?

原因与GCC编译器有关,我用不同版本的GCC编译运行了这个程序:

GCC版本--------4.1.3--------4.4.5--------4.6.3

共有1个答案

赵涵亮
2023-03-14

malloc返回的特定地址是由实现选择的,对于使用代码来说并不总是最优的。您已经知道,移动内存的速度在很大程度上取决于缓存和页面效果。

在这里,具体的指针是不知道的。您可以使用printf(“%p”,ptr)将它们打印出来。然而,已知的是,仅为两个块使用一个malloc肯定避免了两个块之间的页面和缓存浪费。那可能已经是速度差异的原因了。

 类似资料:
  • 我正在为我的UI元素制作一个简单的动画。 我有一个动画组件,它有2个不同的动画-ZoomIn和ZoomOut。 每当需要在屏幕上显示UI元素(如按钮)时,就会显示这些动画。 我通常更喜欢在不显示时停用游戏对象。 我为动画编写了以下方法: 对于大多数屏幕,代码工作正常,但当我使用timescale=0暂停游戏时,代码显示问题。 当时间刻度为0时,线gameObj。SetActive(false)不工

  • 我写了一个fastapi应用程序。现在我正在考虑部署它,但是我似乎遇到了奇怪的意外性能问题,这似乎取决于我使用的是uvicorn还是gunicorn。特别是,如果我使用gunicorn,所有代码(甚至是标准库纯python代码)似乎都会变慢。为了进行性能调试,我编写了一个小应用程序来演示这一点: 运行Fastapi Appi与: get to的共振体始终类似于: 然而使用: 我经常得到这样的时机

  • 问题内容: 如何与决定在HTML堆叠元素的订单时,有关系吗? 当我保持小于由具有一些元件上的发言权。元素落后于没有元素的元素。 问题答案: 具有“自动”以外的z索引值的定位元素和不透明度值小于1的元素将生成堆叠上下文。请参阅有关喷漆顺序的规则。 在您的第一个示例中,我们具有带有多个后代的根堆栈上下文,包括: 定位的Z-index为正的绿色框 带有z-index的蓝色框 带有z-index 的蓝色框

  • 问题内容: 如何访问受以下因素影响的行数: 问题答案: 尝试使用: 将包含一个元素为的元组。因此找到行数: 或者,如果您愿意一口气做到这一点: PS。最好在可能的情况下使用参数化的参数,因为它可以在需要时自动为您引用参数,并防止sql注入。 参数化参数的正确语法取决于您的python /数据库适配器(例如mysqldb,psycopg2或sqlite3)。它看起来像

  • 问题内容: (重要)编辑3: 单独运行testajax2.php而 _不是_Ajax。持续时间大致相同,为1.02-1.03秒。所以我想这意味着问题出在PHP- MySQL或XAMPP中? 当我通过phpMyAdmin查询运行它时,结果如下:显示第0-29行(总计约50行。查询用时 0.0015秒 )。看来问题根本不在于Ajax,而可能在于PHP。我怎样才能解决这个问题?(我也刚刚编辑了问题标题。

  • 问题内容: 如果我有两个查询 和 哪个查询将运行得更快?是where子句/表联接的最大因素,还是返回的列数最大? 我之所以问是因为我正在构建一系列映射到数据库表的对象。通常,每个对象将至少具有以下三种方法: 全选 选择足够的数量以用于填充下拉列表 -选择结果中可见的所有内容,通常约6列左右。 如果每个查询返回的列完全相同,则代码的维护和测试应该更加简单。数据库在任何给定的表中都不可能超过50,00