仰视源码,实现memset
来源:互联网 发布:虚拟桌面软件 编辑:程序博客网 时间:2024/04/29 11:08
——来看看源码的权威
memset主要用于为新申请的内存进行初始化,它是对较大的结构体和数组进行清零操作的一种最快方法。
函数原型:void *memset(void *s, int ch, size_t n);
函数解释:将s中前n个字节用ch填充,并返回s。
对于这些最基本的函数,总有一种冲动想知道其是怎么实现的。
下面就是根据源码而来的memset实现:
void* memset(void* dst,int val, size_t count){ void* ret = dst; while(count--) { *(char*)dst = (char)val; dst = (char*)dst + 1; //移动一个字节 } return ret;}
下面是修改后的实现:
void* memset(void* dst,int val, size_t count){ char* tmpdst = (char*)dst; char tmpval = (char)val; while(count--) { *tmpdst++ = tmpval; } return dst;}
总是感觉下面修改后的实现要比上面源码实现的效率要高,不用多次类型转换。其实不然,编译器可能将上面代码优化的比下面还好。
来吧,测试下看看:
测试代码:
#include <iostream>#include <string>#include <ctime>using namespace std;void* memset1(void* dst,int val, size_t count){ void* ret = dst; while(count--) { *(char*)dst = (char)val; dst = (char*)dst + 1; } return ret;}void* memset2(void* dst,int val, size_t count){ char* tmpdst = (char*)dst; char tmpval = (char)val; while(count--) { *tmpdst++ = tmpval; } return dst;}int _tmain(int argc, _TCHAR* argv[]){ int* a = new int[100000000]; size_t count = sizeof(int)*100000000; clock_t start,finish; long i = 100000L; double duration; int circle = 10; while(circle--) { start = clock(); memset1(a,1,count); finish = clock(); duration = (double)(finish - start)/CLOCKS_PER_SEC; cout<< "memset1: " << duration << endl; start = clock(); memset2(a,2,count); finish = clock(); duration = (double)(finish - start)/CLOCKS_PER_SEC; cout<< "memset2: " << duration << endl; } system("pause"); return 0;}
结果:
结果说明二者都是在上下浮动,但是源码方法普遍比优化后的时间要小。
感觉还是不行,用更精确的方法测试了下。
int _tmain(int argc, _TCHAR* argv[]){ int* a = new int[100000000]; size_t count = sizeof(int)*100000000; LARGE_INTEGER frequency, start, finish; long i = 100000L; int circle = 10; while(circle--) { QueryPerformanceFrequency(&frequency); QueryPerformanceCounter(&start); memset1(a,1,count); QueryPerformanceCounter(&finish); cout<< "memset1: " <<(double)(finish.QuadPart-start.QuadPart)/frequency.QuadPart<<endl; QueryPerformanceFrequency(&frequency); QueryPerformanceCounter(&start); memset2(a,2,count); QueryPerformanceCounter(&finish); cout<< "memset2: " <<(double)(finish.QuadPart-start.QuadPart)/frequency.QuadPart<<endl; } system("pause"); return 0;}
结果:
结果也是讽刺,竟然优化后的结果80%都比没有优化的时间长,说明优化反倒还效率低了。
最后,不得不感叹源代码就是源代码,极致就是极致,虽然结果只有很小的差距,但是结论却是一致的,差之毫厘谬以千里!自以为是地“优化”现在变成了一种讽刺。(此处略去N个字)。还有我在(http://blog.csdn.net/z702143700/article/details/47107701)这篇博客中也做了优化,当时还bb了一下。好吧,哭一会去。
0 0
- 仰视源码,实现memset
- 仰视源码,实现memcpy
- 仰视源码,实现strcpy
- 仰视源码,实现strcmp
- 仰视源码,实现strlen
- 仰视源码,实现memmove
- 仰视源码,实现strstr和find
- 仰视源,实现strcat
- memset函数源码实现
- memset源码
- memset源码
- memset 实现
- memset实现
- string - memset源码
- memset函数源码分析
- memcpy、memset的实现
- memset简单实现
- memset简单实现
- 微信企业号回调模式配置详细讲解
- pip2pi和pypiserver及Apache在pip本地源配置中的应用实践
- 如何使用RMI(Remote Method Invocation)
- OutOfMemoryError PermGen space
- 提高代码性能效率总结(二)--Java
- 仰视源码,实现memset
- 面试总结之Java基础(未完工)
- 如何删除Xcode中安装的插件
- Bootstrap组件之按钮组
- 久违的数据库左连接
- OC--block
- Android中客户端请求服务器端的方式讲解(一)附源码
- 黑马程序员——java中String、StringBuffer、StringBuilder简单见解
- 【天池竞赛系列】阿里移动推荐算法思路解析