malloc与缺页的一些的时间测量

2023-05-16

malloc与缺页的一些的时间测量

时间函数

struct timespec
{
 time_t tv_sec;
 long int tv_nsec;
};
/*
1.which_clock参数解释

CLOCK_REALTIME:系统实时时间,随系统实时时间改变而改变,即从UTC1970-1-1 0:0:0开始计时,中间时刻如果系统时间被用户该成其他,则对应的时间相应改变

CLOCK_MONOTONIC:从系统启动这一刻起开始计时,不受系统时间被用户改变的影响

CLOCK_PROCESS_CPUTIME_ID:本进程到当前代码系统CPU花费的时间

CLOCK_THREAD_CPUTIME_ID:本线程到当前代码系统CPU花费的时间

*/
long sys_clock_gettime (clockid_t which_clock, struct timespec *tp);

这个函数最终会是系统调用,会进入内核,所以估计这个函数的执行时间会比较久,所以先测试这个函数的执行时间代码如下

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
    struct timespec timeStart = {0,0},timeEnd = {0,0};
    clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&timeStart);
    for(int i=0;i<1000;++i)
    {
        clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&timeEnd);
    }
    printf("timeStart = %lus,%luns\n",timeStart.tv_sec,timeStart.tv_nsec);
    printf("timeEnd = %lus,%luns\n",timeEnd.tv_sec,timeEnd.tv_nsec);
    printf("ever sys_gettime call spend %luns\n",(timeEnd.tv_nsec-timeStart.tv_nsec)/1001);
    return 0;

}

最终测试结果摆动较大,在100ns至500ns间摆动,考虑到误差,取均值300ns

开始测试malloc

缺页不频繁的情况下,主要的开销是malloc的算法开销。

第一次测试由于malloc后立马free,所以缺页率非常低

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(int argc,char** argv)
{
    if(argc!=2)
    {
        fprintf(stderr,"error args\n");
        exit(-1);
    }
    void *p;
    int sz = atoi(argv[1]);
    long int sum = 0;
    struct timespec timeStart = {0,0},timeEnd = {0,0};
    for(int i=0;i<1000;++i)
    {
        clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&timeStart);
        p = malloc(sz);
        clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&timeEnd);
        sum += timeEnd.tv_nsec - timeStart.tv_nsec;
        free(p);
    }
    printf("malloc %dByte every time for 1000loops,%luns per\n",sz,sum/1000);
    return 0;

}
/*测试结果
wd@ub-linux:malloc$ ./a.out 256
malloc 256Byte every time for 1000loops,649ns per
wd@ub-linux:malloc$ ./a.out 1024
malloc 1024Byte every time for 1000loops,742ns per
wd@ub-linux:malloc$ ./a.out 4096
malloc 4096Byte every time for 1000loops,222ns per
wd@ub-linux:malloc$ ./a.out 4096
malloc 4096Byte every time for 1000loops,763ns per
wd@ub-linux:malloc$ ./a.out 5000
malloc 5000Byte every time for 1000loops,643ns per
wd@ub-linux:malloc$ ./a.out 5000
malloc 5000Byte every time for 1000loops,716ns per
wd@ub-linux:malloc$ ./a.out 5000
malloc 5000Byte every time for 1000loops,742ns per
wd@ub-linux:malloc$ ./a.out 5000
malloc 5000Byte every time for 1000loops,801ns per
wd@ub-linux:malloc$ ./a.out 5000
malloc 5000Byte every time for 1000loops,327ns per
wd@ub-linux:malloc$ ./a.out 5000
malloc 5000Byte every time for 1000loops,319ns per
wd@ub-linux:malloc$ ./a.out 5000
malloc 5000Byte every time for 1000loops,711ns per
wd@ub-linux:malloc$ ./a.out 5000
malloc 5000Byte every time for 1000loops,816ns per
wd@ub-linux:malloc$ ./a.out 5000
malloc 5000Byte every time for 1000loops,282ns per
wd@ub-linux:malloc$ ./a.out 50000
malloc 50000Byte every time for 1000loops,596ns per
wd@ub-linux:malloc$ ./a.out 50000
malloc 50000Byte every time for 1000loops,661ns per
wd@ub-linux:malloc$ ./a.out 500000
malloc 500000Byte every time for 1000loops,500ns per
wd@ub-linux:malloc$ ./a.out 500000
malloc 500000Byte every time for 1000loops,751ns per
wd@ub-linux:malloc$ ./a.out 500000
malloc 500000Byte every time for 1000loops,178ns per
wd@ub-linux:malloc$ ./a.out 500000
malloc 500000Byte every time for 1000loops,222ns per
wd@ub-linux:malloc$ ./a.out 500000
malloc 500000Byte every time for 1000loops,662ns per
wd@ub-linux:malloc$ ./a.out 500000
malloc 500000Byte every time for 1000loops,749ns per
wd@ub-linux:malloc$ ./a.out 500000
malloc 500000Byte every time for 1000loops,546ns per
wd@ub-linux:malloc$ ./a.out 500000
malloc 500000Byte every time for 1000loops,600ns per
wd@ub-linux:malloc$ ./a.out 500000
malloc 500000Byte every time for 1000loops,546ns per

*/

可以看到这种情况下,每次的时间在200ns到800ns间摆动,由于还加了sys_gettime的开销,所以最终的一次malloc的开销大概在200ns左右。注意,这是在没有缺页的情况下!!!!!

而如果发生了缺页,则时间非常之就,比如将上面的代码的free(p)注释掉,然后执行

wd@ub-linux:malloc$ ./a.out 4096
malloc 4096Byte every time for 1000loops,3855ns per

会发现时间变得特别巨大,直接跳到了3800ns+。这个参数是4096,就是说每次申请4k的内存,就是一页内存而不还给os,这样几乎每次申请都会出现缺页。可以看到缺页处理时间几乎是malloc本身算法执行时间的10倍。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

malloc与缺页的一些的时间测量 的相关文章

  • 我可以依赖 malloc 返回 NULL 吗?

    我在 Unix 系统上读到过 malloc即使内存实际上不可用 也可以返回非 NULL 指针 并且稍后尝试使用该内存将触发错误 由于我无法通过检查 NULL 来捕获此类错误 因此我想知道检查 NULL 到底有多大用处 在相关的说明中 Her
  • C++ 中可以混合使用 free 和构造函数吗? [复制]

    这个问题在这里已经有答案了 可能的重复 调用free 或delete而不是delete 有什么危险吗 https stackoverflow com questions 1612031 is there any danger in call
  • 在C中,malloc(256)和malloc(sizeof(char)*256)等价吗?

    我看到人们经常编写 C 代码 例如 char ptr malloc sizeof char 256 这真的有必要吗 标准说sizeof char 1根据定义 这样写是不是有意义 char ptr malloc 256 是的 C 定义了siz
  • 你怎么知道用 malloc() 分配多少空间?

    我是一个完全的 C 新手 我来自 C 我一直在学习内存管理和malloc 功能 我也遇到过这段代码 char a persons name malloc sizeof char 2 我不明白这是分配了多少空间a persons name 是
  • C/C++ 的多线程内存分配器

    我目前有大量的多线程服务器应用程序 并且我正在寻找一个好的多线程内存分配器 到目前为止 我在以下两点之间左右为难 太阳乌梅 谷歌的tcmalloc 英特尔的线程构建块分配器 埃默里 伯杰的宝藏 据我所知 hoard 可能是最快的 但我在今天
  • sbrk 在 malloc.c 中如何/在何处使用?

    我在 高级 Unix 编程 以及其他几本书 中读到 Linuxmalloc 使用Linux系统调用sbrk 向操作系统请求内存 我正在看 glibcmalloc c代码 我可以看到很多提及sbrk 在注释中 但没有在代码中直接引用 如何 在
  • C 中的字符串和指针

    include
  • Malloc 的字符串包含垃圾值

    我刚刚将 Objective C 库转换为 C 库 希望能够跨平台 然而 在我将这件事发送出去进行处理之前 一切似乎都正常 就在我收到错误的时候 回顾一些修改 我注意到调试器中的一些东西 就在 malloc 的字符串之后 如下所示 char
  • 使用 malloc() 为 const char 字符串动态分配内存

    我正在编写一个程序 该程序从 ini 文件读取值 然后将该值传递到接受 PCSTR 即 const char 的函数中 函数是getaddrinfo 所以 我想写PCSTR ReadFromIni 为了返回一个常量字符串 我计划使用分配内存
  • 如何分配二维数组? [复制]

    这个问题在这里已经有答案了 我需要创建一个二维数组 目前我将其创建为int a 100 100 但我需要使用动态分配内存malloc在C语言中 我用了代码 include
  • C中的内存使用问题

    请帮忙 操作系统 Linux 其中 sleep 1000 中 此时 top 显示Linux任务 给我写了7 7 MEM使用 valgrind 未发现内存泄漏 我明白 写得正确 所有 malloc 结果都是 NULL 但是为什么这次 睡眠 我
  • 编译器优化对 malloc 的调用以返回更多弱对齐内存是否合法?

    假设我们有以下代码 include
  • 是否可以用 C 语言编写 malloc 的一致实现?

    这是后续字符数组可以与任何数据类型一起使用吗 https stackoverflow com questions 38510557 我了解动态内存和 malloc 的常见实现 可以在以下位置找到参考资料维基百科 https en wikip
  • 为什么 char 指针保存的数据比 C 中分配的内存更多?

    在使用 C 进行动态内存分配时 我在将内存大小分配给 char 指针时感到困惑 虽然我只给出 1 个字节作为限制 char 指针成功地接收尽可能长的输入 假定每个字母对应 1 个字节 我还尝试查找输入前后指针的大小 我怎样才能理解这里发生了
  • mprotect 之后 malloc 导致分段错误

    在使用 mprotect 保护内存区域后第一次调用 malloc 时 我遇到分段错误 这是执行内存分配和保护的代码片段 define PAGESIZE 4096 void paalloc int size Allocates and ali
  • 如何释放字符指针数组?

    我使用此方法将列表中的值转换为数组 以便在 execvp 系统调用中使用 char list2argarray struct shellvalue values int count char array char malloc count
  • memcpy 到动态存储结构安全吗?

    Context 我正在审查一些代码 这些代码从 IO 描述符接收数据到字符缓冲区 对其进行一些控制 然后使用接收到的缓冲区的一部分来填充结构 突然想知道是否可能涉及严格的别名规则违规 这是一个简化版本 define BFSZ 1024 st
  • 使用 cudamalloc()。为什么是双指针?

    我目前正在浏览有关的教程示例http code google com p stanford cs193g sp2010 http code google com p stanford cs193g sp2010 学习CUDA 演示的代码 g
  • new 运算符(以及 malloc)无法分配约 450 MB 的内存 [重复]

    这个问题在这里已经有答案了 我正在开发一个程序 该程序在内存中存储大约 2 2 亿个短值的数组 该数据块的分配方式如下 short arrayName new short SIZE OF ARRAY 然后将文件的内容读入内存 在团队中的另一
  • 如果 free() 知道我的数组的长度,为什么我不能在自己的代码中请求它?

    我知道将动态分配的数组的长度传递给操作它们的函数是一个常见的约定 void initializeAndFree int anArray size t length int main size t arrayLength 0 scanf d

随机推荐

  • VS Code搭建PYQT5环境并创建Helloworld实例

    使用Python pip安装PyQt5和PyQt5 tool pip install PyQt5 pip install PyQt5 tools 在VS code中安装插件PYQT Integration 配置PYQT Integratio
  • ubuntu Xrdp远程连接Authentication is required to create a color managed device

    问题 Gnome Bug xff1a 无法点击 永不消逝的授权对话框 解决 xff1a https blog csdn net wu weijie article details 108481456
  • Linux运维入门~21.系统磁盘管理,解决u盘连接电脑无反应,解决卸载u盘正忙问题

    本节我们来了解一下linux系统的磁盘管理 识别设备常用命令有 xff1a fdisk l 查看真实存在的设备 cat proc partition 系统识别的设备 blkid 系统可使用的设备 df 系统正在挂载的设备 du 查看磁盘容量
  • 快速幂取模:求 a^b % N(C++)

    在某些情况下 xff0c 我们需要求模 N 情况下某个数的多次幂 xff0c 例如 xff1a 求多次幂结果的最后几位数 RSA算法的加解密 如果底数或者指数很大 xff0c 直接求幂再取模很容易会出现数据溢出的情况 xff0c 产生错误的
  • 新手教程:手把手教你使用Powershell批量修改文件名

    适合完全没用过 xff0c 没了解过powershell的人 1 打开Windows Powershell ISE 在任务栏搜索框中输入ISE xff0c 然后打开 xff08 我的任务栏放在右边了 xff0c 所以是这个样子 xff09
  • Mac OS 开机密码重置

    通过 Mac OS 恢复功能启动 Apple 芯片 xff1a 将 Mac 开机并继续按住电源按钮 xff0c 直至看到启动选项窗口 选择标有 选项 字样的齿轮图标 xff0c 然后点按 继续 Intel 处理器 xff1a 将 Mac 开
  • 表达式求值:从“加减”到“带括号的加减乘除”的实践过程

    本文乃Siliphen原创 xff0c 转载请注明出处 xff1a http blog csdn net stevenkylelee 为什么想做一个表达式求值的程序 最近有一个需求 xff0c 策划想设置游戏关卡的某些数值 xff0c 这个
  • Linux中source命令,在Android build 中的应用

    source命令 xff1a source命令也称为 点命令 xff0c 也就是一个点符号 xff08 xff09 source命令通常用于重新执行刚修改的初始化文件 xff0c 使之立即生效 xff0c 而不必注销并重新登录 用法 xff
  • Edge 错误代码: STATUS_ACCESS_DENIED 解决方案

    1 到C盘Edge的文件全部删掉 2 到电脑管家的软件管理重新下载Edge 或者 去官网下载 3 再次打开Edge xff0c 功能都回来了 注 xff1a 该解决方案源自于edge吧的四川男篮大佬
  • centos7.9离线安装mysql5.7

    前言 windows server2003服务器 xff0c 安装mysql提示需要net framework xff0c 费了半天劲装好了 xff0c 发现解压版redis无法启动 xff0c 换了个低版本也是无法安装 xff0c 服务器
  • vs2019-slicer编译问题记录

    3D Slicer编译过程问题记录 官网教程 xff1a https slicer readthedocs io en latest developer guide build instructions windows html 环境 CM
  • sudo npm command not found 问题解决

    这种情况通常是使用 npm 命令可以正常使用 xff0c 但使用sudo npm 命令便会报 command not found 这是什么原因呢 xff1f 输入which npm可以得到 usr local bin npm xff0c 这
  • (POJ1201)Intervals <差分约束系统-区间约束>

    Intervals Description You are given n closed integer intervals ai bi and n integers c1 cn Write a program that reads the
  • 【sv与c】sv与c交互

    网上此类文章很多 xff0c 这里暂时不放具体实现和测试结果 xff0c 后续持续更新 下面引用一些帖子 xff0c 帖子中涉及到具体做法 vcs联合编译v sv c 43 43 代码 sxlwzl的专栏 CSDN博客 1 xff0c 假设
  • stm32f103c8t6最小系统

    提示 xff1a 文章写完后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 文章目录 前言stm32f103c8t6构成二 xff1a 电源电路稳压模块注意 复位电路NRST 时钟电路程序下载电路JTAGSWD 启
  • udp中的connect()&bind()

    connect amp bind 的作用 udp udp connect span class hljs preprocessor include lt sys types h gt span span class hljs preproc
  • Linux Hook技术实践

    LInux Hook技术实践 什么是hook 简单的说就是别人本来是执行libA so里面的函数的 xff0c 结果现在被偷偷换成了执行你的libB so里面的代码 xff0c 是一种替换 为什么hook 恶意代码注入调用常用库函数时打lo
  • Tensorflow Cnn mnist 的一些细节

    Tensorflow cnn MNIST 笔记 写这个完全是记录看官网example时不懂 xff0c 但后来弄懂的一些细节 当然这个可以算是对官方文档的补充 xff0c 也许每个人遇到的不懂都不一样 xff0c 但希望对大家有帮助 先上代
  • effective cpp 读书笔记2

    当你用到多态时 xff0c 务必把析构函数做成虚函数 以前知道子类的析构函数会自动调用父类的析构函数 xff0c 然而今天却发现不总是这样 当你用基类的指针指向派生类时 xff0c 然后delete这个指针时 xff0c 有可能就不会调用派
  • malloc与缺页的一些的时间测量

    malloc与缺页的一些的时间测量 时间函数 span class hljs keyword struct span timespec time t tv sec span class hljs keyword long span span