阴沟里翻船之C函数memset

服务端每次处理客户端请求的执行实现发现已接近100毫秒左右,这尼玛真不能忍。起初还怀疑是与memcache服务进行通讯上的问题,结果经过一步步打log输出各个环节的调用时间,最终定位到了一个C函数memset !!!占用了每次处理的99%的时间!

每次在收到服务端的请求时都对一个50M左右的数据执行了一次memset.看来这种做法对于大数据来讲是件奢侈的事情。看了下memset源码实现,至少要调用bytesize/4次的循环...时间都花在这了。

最后抛弃了memset,取而代之将数据的关键成员一个个手动赋值,执行时间降到了<2毫秒...

所以面对这次血粼粼的教训,要慎用memset处理大的数据。




### C语言 `memset` 函数使用说明 #### 函数原型 `memset` 是 C 语言标准库中的一个函数,用于将指定的内存块设置为某个特定值。其函数原型如下: ```c void *memset(void *ptr, int value, size_t num); ``` 参数解释: - `ptr`: 指向要填充的内存区域的指针。 - `value`: 要被写入到该内存区域的值。注意这个值会被转换成无符号字符(即只取低8位)。 - `num`: 需要被设置的字节数。 返回值:指向已处理字符串的指针[^3]。 #### 初始化数组或结构体 可以利用 `memset` 来快速初始化整个数组或结构体的内容至零或其他常量值。对于数值型数据成员来说,这通常意味着将其置零;而对于字符类型,则可能是填满相同的字符[^4]。 #### 示例代码 下面是一个简单的例子展示如何使用 `memset` 对整数数组进行初始化操作: ```c #include <stdio.h> #include <string.h> // 包含 memset 定义所在的头文件 int main(){ int array[5]; // 将array中所有元素设为0 memset(array, 0, sizeof(array)); printf("After setting all elements to zero:\n"); for(int i=0;i<5;i++){ printf("%d ", array[i]); } } ``` 这段程序会输出五个连续的零,因为已经通过调用 `memset` 把每一个位置都赋给了零值[^1]。 另一个常见的应用场景是对自定义的数据结构做同样的事情: ```c typedef struct { char name[20]; float score; } Student; Student studentRecord; // 清除studentRecord的所有字段 memset(&studentRecord, '\0', sizeof(Student)); strcpy(studentRecord.name,"John Doe"); studentRecord.score = 95.7f; ``` 这先用了 `memset` 设置了一个学生记录为空白状态,再对其属性进行了正常赋值[^2]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值