[C语言] memset的效率分析

测试100M(1亿)个元素的初始化时间长度作为效率对比参考值。CPU: Intel i5@2.90GHZ

最后封装一个优化后的自定义双字节memset函数。

cpp 复制代码
typedef unsigned char      uint8_t;
typedef unsigned short     uint16_t;
typedef unsigned int       uint32_t;
typedef unsigned long long uint64_t;

#define MAX_SIZE (1024*1024*100)  //100MiByte
uint8_t pBuff[MAX_SIZE] = { 0 };
      
    uint64_t len = MAX_SIZE;
    uint16_t value = 0x1234;    
    uint8_t ch_High = value >> 8;
    uint8_t ch_Low  = value&0xFF;
  
    //测试1:传统for运行耗时47ms  
    for (uint64_t i = 0; i < len/2; i++)
    {
       pBuff[i] = ch_High;
       pBuff[i+1] = ch_Low;
    }
    //测试2:指针for运行耗时31ms  
    uint8_t* pt = pBuff;
    for (uint64_t i = 0; i < len/2; i ++ )
    {
        *(uint16_t*)pt = value;
        pt += 2;
     }

//通过以上测试可以看出用指针赋值比传统数组赋值快51%
//故有优化后的my_memset函数,用于初始化双字节函数。

void my_memset(uint8_t *buf,uint16_t value,uint64_t len)
{
    for (uint64_t i = 0; i < len/2; i ++)
    {
        *(uint16_t*)buf = value;//关键:指针类型的转换
        buf += 2;
    }   
}


//整体测试使用
void main()
{
    uint8_t testData[10] = { 0 };

    my_memset(testData, 0x1234, sizeof(testData));

    for (size_t i = 0; i < sizeof(testData); i++)
    {
        printf("%02x ",testData[i]);
    }
}

//最终输出:34 12 34 12 34 12 34 12 34 12
相关推荐
古希腊掌管学习的神3 分钟前
[LeetCode-Python版]相向双指针——611. 有效三角形的个数
开发语言·python·leetcode
赵钰老师3 分钟前
【R语言遥感技术】“R+遥感”的水环境综合评价方法
开发语言·数据分析·r语言
就爱学编程11 分钟前
重生之我在异世界学编程之C语言小项目:通讯录
c语言·开发语言·数据结构·算法
Oneforlove_twoforjob35 分钟前
【Java基础面试题025】什么是Java的Integer缓存池?
java·开发语言·缓存
emoji11111135 分钟前
前端对页面数据进行缓存
开发语言·前端·javascript
每天都要学信号1 小时前
Python(第一天)
开发语言·python
TENET信条1 小时前
day53 第十一章:图论part04
开发语言·c#·图论
北国无红豆1 小时前
【CAN总线】STM32的CAN外设
c语言·stm32·嵌入式硬件
生信圆桌1 小时前
【生信圆桌x教程系列】如何安装 seurat V5版本R包,最详细安装手册
开发语言·r语言
IT猿手1 小时前
最新高性能多目标优化算法:多目标麋鹿优化算法(MOEHO)求解TP1-TP10及工程应用---盘式制动器设计,提供完整MATLAB代码
开发语言·深度学习·算法·机器学习·matlab·多目标算法