bzero memset置零的性能比较

2024-03-17 11:08
文章标签 比较 性能 memset bzero

本文主要是介绍bzero memset置零的性能比较,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 关于字符数组的初始化,在项目的压力测试中,发现性能明显下降,变怀疑在程序中的若干临时字符数组的初始化(使用bzero)身上。于是修改为首个字符置 零的方式而非全部置零的方式初始化,响应得到明显的提升。原来在mp3检索的每一条结果都要进行bzero对临时数组初始化,每一个请求需要30次的 bzero对临时数组的置零。于是想到了,在非必要的情况下,只对临时数组的第一个(或前几个)字符置零的初始化方式对比与使用bzero的话,能够明显 提高性能。

在此之外,又想起另外两种对数组所有字节都置零的方式,顺便比较一下他们之间的性能,写个简单的程序如下:

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

#define TIMEDIFF(s, e) (((e.tv_sec)-(s.tv_sec))*1000000 + (e.tv_usec) - (s.tv_usec))

int main()
{
    struct timeval s, e;
    char a[1024], b[1024*1024], c[1024*1024*4];

    gettimeofday(&s, NULL);
    bzero(a, sizeof(a));
    gettimeofday(&e, NULL);
    printf("bzero 1k: %d/n", TIMEDIFF(s, e));

    gettimeofday(&s, NULL);
    bzero(b, sizeof(b));
    gettimeofday(&e, NULL);
    printf("bzero 1m: %d/n", TIMEDIFF(s, e));

    gettimeofday(&s, NULL);
    bzero(c, sizeof(c));
    gettimeofday(&e, NULL);
    printf("bzero 4M: %d/n", TIMEDIFF(s, e));

    gettimeofday(&s, NULL);
    memset(a, 0, sizeof(a));
    gettimeofday(&e, NULL);
    printf("memset 1k: %d/n", TIMEDIFF(s, e));

    gettimeofday(&s, NULL);
    memset(b, 0, sizeof(b));
    gettimeofday(&e, NULL);
    printf("memset 1M: %d/n", TIMEDIFF(s, e));

    gettimeofday(&s, NULL);
    memset(c, 0, sizeof(c));
    gettimeofday(&e, NULL);
    printf("memset 4M: %d/n", TIMEDIFF(s, e));

    gettimeofday(&s, NULL);
    for(int i=0; i<sizeof(a); ++i)
        a[i]=0;
    gettimeofday(&e, NULL);
    printf("for 1k: %d/n", TIMEDIFF(s, e));

    gettimeofday(&s, NULL);
    for(int i=0; i<sizeof(b); ++i)
        b[i]=0;
    gettimeofday(&e, NULL);
    printf("for 1M: %d/n", TIMEDIFF(s, e));

    gettimeofday(&s, NULL);
    memset(c, 0, sizeof(c));
    gettimeofday(&e, NULL);
    printf("memset 4M: %d/n", TIMEDIFF(s, e));

    gettimeofday(&s, NULL);
    for(int i=0; i<sizeof(a); ++i)
        a[i]=0;
    gettimeofday(&e, NULL);
    printf("for 1k: %d/n", TIMEDIFF(s, e));

    gettimeofday(&s, NULL);
    for(int i=0; i<sizeof(b); ++i)
        b[i]=0;
    gettimeofday(&e, NULL);
    printf("for 1M: %d/n", TIMEDIFF(s, e));

    gettimeofday(&s, NULL);
    for(int i=0; i<sizeof(c); ++i)
        c[i]=0;
    gettimeofday(&e, NULL);
    printf("for 4M: %d/n", TIMEDIFF(s, e));
}

运行的结果基本上是,在数组较小的情况下,bzero的效率比memset高;当数组超过一定大小之后,bzero的效率开始比memset低;数组越 大,memset的性能优势越明显。而在数组较小的情况下,memset的性能甚至不如直接for循环对数组中的每一个字节置零的方法。

以下的运行结果的数值单位是微秒(gettimeofday的默认单位)。

第一次运行:
bzero 1k: 6
bzero 1m: 2168
bzero 4M: 9136
memset 1k: 11
memset 1M: 1303
memset 4M: 5483
for 1k: 12
for 1M: 4934
for 4M: 21313

再一次运行:
bzero 1k: 6
bzero 1m: 2160
bzero 4M: 9067
memset 1k: 17
memset 1M: 1257
memset 4M: 5115
for 1k: 11
for 1M: 4866
for 4M: 19201

此后,又写了个小程序,测试在堆上的数组中,bzero和memset的效率,发现两者差不多。可能由于,里面原来的数据就比较有规则,不管是否先对数组置一随机值。(malloc开辟字符数组空间时,会清零的。)

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

#define TIMEDIFF(s, e) (((e.tv_sec)-(s.tv_sec))*1000000 + (e.tv_usec) - (s.tv_usec))

int main()
{
    srand(time(NULL));
    char *array;
    struct timeval s, e;
    int tb, tm;
    for(int i=1; i<1024*1024*1024; i*=2)
    {
        array=(char*)malloc(i);
        memset(array, rand()%256, i);
        gettimeofday(&s, NULL);
        bzero(array, i);
        gettimeofday(&e, NULL);
        tb=TIMEDIFF(s, e);
        free(array);

        array=(char*)malloc(i);
        memset(array, rand()%256, i);
        gettimeofday(&s, NULL);
        memset(array, 0, i);
        gettimeofday(&e, NULL);
        tm=TIMEDIFF(s, e);
        free(array);

        printf("array size: %d /tbzero time: %d /tmemset time: %d /tbzero>memset?: %d/n", i, tb, tm, (tb>tm));

    }
}


运行结果:
array size: 1   bzero time: 28 memset time: 1 bzero>memset?: 1
array size: 2   bzero time: 1   memset time: 1 bzero>memset?: 0
array size: 4   bzero time: 1   memset time: 1 bzero>memset?: 0
array size: 8   bzero time: 1   memset time: 1 bzero>memset?: 0
array size: 16 bzero time: 1   memset time: 1 bzero>memset?: 0
array size: 32 bzero time: 1   memset time: 1 bzero>memset?: 0
array size: 64 bzero time: 1   memset time: 0 bzero>memset?: 1
array size: 128         bzero time: 1   memset time: 1 bzero>memset?: 0
array size: 256         bzero time: 1   memset time: 1 bzero>memset?: 0
array size: 512         bzero time: 1   memset time: 1 bzero>memset?: 0
array size: 1024        bzero time: 1   memset time: 1 bzero>memset?: 0
array size: 2048        bzero time: 1   memset time: 1 bzero>memset?: 0
array size: 4096        bzero time: 2   memset time: 2 bzero>memset?: 0
array size: 8192        bzero time: 2   memset time: 2 bzero>memset?: 0
array size: 16384       bzero time: 5   memset time: 6 bzero>memset?: 0
array size: 32768       bzero time: 9   memset time: 8 bzero>memset?: 1
array size: 65536       bzero time: 27 memset time: 24         bzero>memset?: 1
array size: 131072      bzero time: 81 memset time: 68         bzero>memset?: 1
array size: 262144      bzero time: 190         memset time: 169        bzero>memset?: 1
array size: 524288      bzero time: 447         memset time: 393        bzero>memset?: 1
array size: 1048576     bzero time: 996         memset time: 973        bzero>memset?: 1
array size: 2097152     bzero time: 2258        memset time: 2272       bzero>memset?: 0
array size: 4194304     bzero time: 4821        memset time: 4799       bzero>memset?: 1
array size: 8388608     bzero time: 9797        memset time: 9799       bzero>memset?: 0
array size: 16777216    bzero time: 19764       memset time: 19737      bzero>memset?: 1
array size: 33554432    bzero time: 39687       memset time: 39675      bzero>memset?: 1
array size: 67108864    bzero time: 79907       memset time: 79324      bzero>memset?: 1
array size: 134217728   bzero time: 158956      memset time: 158775     bzero>memset?: 1
array size: 268435456   bzero time: 318247      memset time: 318632     bzero>memset?: 0
array size: 536870912   bzero time: 638536      memset time: 638883     bzero>memset?: 0

这篇关于bzero memset置零的性能比较的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/818768

相关文章

Vue3 的 shallowRef 和 shallowReactive:优化性能

大家对 Vue3 的 ref 和 reactive 都很熟悉,那么对 shallowRef 和 shallowReactive 是否了解呢? 在编程和数据结构中,“shallow”(浅层)通常指对数据结构的最外层进行操作,而不递归地处理其内部或嵌套的数据。这种处理方式关注的是数据结构的第一层属性或元素,而忽略更深层次的嵌套内容。 1. 浅层与深层的对比 1.1 浅层(Shallow) 定义

百度/小米/滴滴/京东,中台架构比较

小米中台建设实践 01 小米的三大中台建设:业务+数据+技术 业务中台--从业务说起 在中台建设中,需要规范化的服务接口、一致整合化的数据、容器化的技术组件以及弹性的基础设施。并结合业务情况,判定是否真的需要中台。 小米参考了业界优秀的案例包括移动中台、数据中台、业务中台、技术中台等,再结合其业务发展历程及业务现状,整理了中台架构的核心方法论,一是企业如何共享服务,二是如何为业务提供便利。

性能测试介绍

性能测试是一种测试方法,旨在评估系统、应用程序或组件在现实场景中的性能表现和可靠性。它通常用于衡量系统在不同负载条件下的响应时间、吞吐量、资源利用率、稳定性和可扩展性等关键指标。 为什么要进行性能测试 通过性能测试,可以确定系统是否能够满足预期的性能要求,找出性能瓶颈和潜在的问题,并进行优化和调整。 发现性能瓶颈:性能测试可以帮助发现系统的性能瓶颈,即系统在高负载或高并发情况下可能出现的问题

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

黑神话,XSKY 星飞全闪单卷性能突破310万

当下,云计算仍然是企业主要的基础架构,随着关键业务的逐步虚拟化和云化,对于块存储的性能要求也日益提高。企业对于低延迟、高稳定性的存储解决方案的需求日益迫切。为了满足这些日益增长的 IO 密集型应用场景,众多云服务提供商正在不断推陈出新,推出具有更低时延和更高 IOPS 性能的云硬盘产品。 8 月 22 日 2024 DTCC 大会上(第十五届中国数据库技术大会),XSKY星辰天合正式公布了基于星

从状态管理到性能优化:全面解析 Android Compose

文章目录 引言一、Android Compose基本概念1.1 什么是Android Compose?1.2 Compose的优势1.3 如何在项目中使用Compose 二、Compose中的状态管理2.1 状态管理的重要性2.2 Compose中的状态和数据流2.3 使用State和MutableState处理状态2.4 通过ViewModel进行状态管理 三、Compose中的列表和滚动

关键字synchronized、volatile的比较

关键字volatile是线程同步的轻量级实现,所以volatile性能肯定比synchronized要好,并且volatile只能修饰于变量,而synchronized可以修饰方法,以及代码块。随着JDK新版本的发布,synchronized关键字的执行效率上得到很大提升,在开发中使用synchronized关键字的比率还是比较大的。多线程访问volatile不会发生阻塞,而synchronize

PR曲线——一个更敏感的性能评估工具

在不均衡数据集的情况下,精确率-召回率(Precision-Recall, PR)曲线是一种非常有用的工具,因为它提供了比传统的ROC曲线更准确的性能评估。以下是PR曲线在不均衡数据情况下的一些作用: 关注少数类:在不均衡数据集中,少数类的样本数量远少于多数类。PR曲线通过关注少数类(通常是正类)的性能来弥补这一点,因为它直接评估模型在识别正类方面的能力。 精确率与召回率的平衡:精确率(Pr

SQL2005 性能监视器计数器错误解决方法

【系统环境】 windows 2003 +sql2005 【问题状况】 用户在不正当删除SQL2005后会造成SQL2005 性能监视器计数器错误,如下图 【解决办法】 1、在 “开始” --> “运行”中输入 regedit,开启注册表编辑器,定位到 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVer

Linux性能分析工具合集

Linux性能分析工具合集 工具合集主要包含以下各种工具,对于了解Linux系统结构、网络结构、内核层次具有一定的帮助。 Linux Performance Observability ToolsLinux Static Performance ToolsLinux Performance Benchmark ToolsLinux Performance Tuning ToolsLinux