memcpy性能测试
来源:互联网 发布:游戏编程 培训机构 编辑:程序博客网 时间:2024/05/16 19:27
存在的问题
1。测试结果以微秒为单位,明显不靠谱
2.gettimeofday精度不足,对高精度需要用汇编改写
3.存在cache缓存,建议测试时尽量模拟真实环境
至少存在以上三个问题,不知道为什么会被搞成“推荐文章”,
2.gettimeofday精度不足,对高精度需要用汇编改写
3.存在cache缓存,建议测试时尽量模拟真实环境
至少存在以上三个问题,不知道为什么会被搞成“推荐文章”,
1。堆、栈中的内存区别
不同点:
堆内存是malloc分配的,直到程序结束或用free释放
栈内存是函数局部变量或参数,函数结束则自动释放
相同点:
二者都存在于内存中,对于memcpy的测试没影响,因此使用栈内存方便。
2。测试的开始,结束边界
t1 = time1;
for ( ... ) {
memcpy(...);
}
t2 = time2;
delta = t2 - t1;
3。char[1024]的大小
1)位(比特),bit,表示0或1,速率 (bps)bits per second
2)字节,byte, 1byte = 8bits,速率(Bps)Byte per second
56Kbps拨号上网的速度是7 byte/s
char是8位,1个字节,char[1024]就是1024个字节,也就是1KB
32位系统,int是32位,4个字节大小
4。多组数据测试,1K,10K,100K,1M
1K,char[1024];
10K,char[1024*10];
100K,char[1024*100];
1M,char[1024*1024];
5。GCC优化级别,-O0,-O1,-O2,-O3,-O,-Os
-O0,不做优化
-O1,-O,减少编译后的代码大小和执行时间(reduce code size and execution time)
-O2,在-O1的基础上,增加编译时间和生成的代码的性能
-O3,在-O2的基础上,还加了剩下的几个优化选项
-Os,在-O2的基础上,但是生成的代码比-O2小
由于发行版的程序肯定会做优化,因此测试程序使用-O2
详见文章末尾的参考资料
6。GCC版本
gcc-4.4.1
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <sys/time.h>
- /* 测试数据大小 */
- #define SIZE_1K 1024
- #define SIZE_10K 1024*10
- #define SIZE_100K 1024*100
- #define SIZE_1M 1024*1024
- /* 1M数据*/
- void test_1M(void)
- {
- struct timeval start;
- struct timeval end;
- int ret_start = -1;
- int ret_end = -1;
- char src[SIZE_1M];
- char dst[SIZE_1M];
- int i;
- long delta_time;
- /* 测试开始 */
- ret_start = gettimeofday(&start, NULL);
- for ( i = 0; i< 1000; ++i )
- {
- memcpy(src, dst, SIZE_1M);
- }
- ret_end = gettimeofday(&end, NULL);
- /* 测试结束,确保函数执行成功 */
- if ( ret_start != 0 || ret_end != 0 )
- {
- exit( -1 );
- }
- /* 输出测试结果 */
- delta_time = (end.tv_sec* 1000000 + end.tv_usec) - (start.tv_sec * 1000000 + start.tv_usec);
- fprintf(stderr, "SIZE_1M, \t\t%ldus\n", delta_time);
- }
- /* 100K数据*/
- void test_100k(void)
- {
- struct timeval start;
- struct timeval end;
- int ret_start = -1;
- int ret_end = -1;
- char src[SIZE_100K];
- char dst[SIZE_100K];
- int i;
- long delta_time;
- /* 测试开始 */
- ret_start = gettimeofday(&start, NULL);
- for ( i = 0; i< 1000; ++i )
- {
- memcpy(src, dst, SIZE_100K);
- }
- ret_end = gettimeofday(&end, NULL);
- /* 测试结束,确保函数执行成功 */
- if ( ret_start != 0 || ret_end != 0 )
- {
- exit( -1 );
- }
- /* 输出测试结果 */
- delta_time = (end.tv_sec* 1000000 + end.tv_usec) - (start.tv_sec * 1000000 + start.tv_usec);
- fprintf(stderr, "SIZE_100K, \t\t%ldus\n", delta_time);
- }
- /* 10K数据*/
- void test_10k(void)
- {
- struct timeval start;
- struct timeval end;
- int ret_start = -1;
- int ret_end = -1;
- char src[SIZE_10K];
- char dst[SIZE_10K];
- int i;
- long delta_time;
- /* 测试开始 */
- ret_start = gettimeofday(&start, NULL);
- for ( i = 0; i< 1000; ++i )
- {
- memcpy(src, dst, SIZE_10K);
- }
- ret_end = gettimeofday(&end, NULL);
- /* 测试结束,确保函数执行成功 */
- if ( ret_start != 0 || ret_end != 0 )
- {
- exit( -1 );
- }
- /* 输出测试结果 */
- delta_time = (end.tv_sec* 1000000 + end.tv_usec) - (start.tv_sec * 1000000 + start.tv_usec);
- fprintf(stderr, "SIZE_10k, \t\t%ldus\n", delta_time);
- }
- /* 1K数据*/
- void test_1k(void)
- {
- struct timeval start;
- struct timeval end;
- int ret_start = -1;
- int ret_end = -1;
- char src[SIZE_1K];
- char dst[SIZE_1K];
- int i;
- long delta_time;
- /* 测试开始 */
- ret_start = gettimeofday(&start, NULL);
- for ( i = 0; i< 1000; ++i )
- {
- memcpy(src, dst, SIZE_1K);
- }
- ret_end = gettimeofday(&end, NULL);
- /* 测试结束,确保函数执行成功 */
- if ( ret_start != 0 || ret_end != 0 )
- {
- exit( -1 );
- }
- /* 输出测试结果 */
- delta_time = (end.tv_sec* 1000000 + end.tv_usec) - (start.tv_sec * 1000000 + start.tv_usec);
- fprintf(stderr, "SIZE_1k, \t\t%ldus\n", delta_time);
- }
- int main(int argc, char **argv)
- {
-
- test_1k();
- test_10k();
- test_100k();
- test_1M();
- return 0;
- }
测试结果:1000拷贝操作所消耗的时间
SIZE_1k, 350us
SIZE_10k, 5502us
SIZE_100K, 96624us
SIZE_1M, 689399us
参考:
http://gcc.gnu.org/onlinedocs/gcc-4.4.1/gcc/Optimize-Options.html#Optimize-Options
0
上一篇:WIRESHARK之SSL解密
下一篇:缓存小结
相关热门文章
- socket中的短连接与长连接,心...
- Haproxy、Keepalived双主高可...
- Tomcat的性能与最大并发(1000)...
- Nginx深入详解之日志
- socket编程的同步、异步与阻塞...
- linux dhcp peizhi roc
- 关于Unix文件的软链接
- 求教这个命令什么意思,我是新...
- sed -e "/grep/d" 是什么意思...
- 谁能够帮我解决LINUX 2.6 10...
给主人留下些什么吧!~~
tanningzhong2013-05-31 14:25:29
楼主不是test 1K的数据么? 怎么还得循环拷贝一千次?
回复 | 举报
ckelsel2013-05-07 10:46:54
pxy052152:楼主没有考虑cache的影响,这个测试是有问题的。
确实没考虑到,这个是DEMO版,还需要继续优化
回复 | 举报pxy0521522013-05-07 09:02:06
楼主没有考虑cache的影响,这个测试是有问题的。
回复 | 举报
firecityplans2013-05-06 19:30:31
学习了。
回复 | 举报
评论热议
0 0
- memcpy性能测试
- 在Cortex-A8平台下memcpy性能的测试
- 【C_C++】memcpy 性能优化
- memcpy函数测试
- memcpy函数测试
- memcpy的速度测试
- 在Cortex-A8平台下memcpy ARM/NEON汇编性能的测试
- 在Cortex-A8平台下memcpy ARM/NEON汇编性能的测试
- 在Cortex-A8平台下memcpy ARM/NEON汇编性能的测试
- memcpy与sendto耗时测试
- 嵌入式系统上memcpy的性能优化
- 性能测试
- 性能测试
- 性能测试
- 性能测试
- 性能测试
- 性能测试
- 性能测试
- 位图之屏蔽位图
- UltraEdit 不能复制粘贴
- spark性能调优
- WIRESHARK之SSL解密
- cocoapods编辑Podfile文件
- memcpy性能测试
- 缓存小结
- 快速理解设计模式之创建型设计模式(上)
- 如何获取显示器的EDID信息
- Git命令之 分支操作
- VIM 小记 内含多个内容
- Redis 常用命令以及使用事务、设置key超时
- Spring-MVC第二弹数据库链接
- java数组排序方法笔记
原创粉丝点击
热门IT博客
热门问题
老师的惩罚
人脸识别
我在镇武司摸鱼那些年
重生之率土为王
我在大康的咸鱼生活
盘龙之生命进化
天生仙种
凡人之先天五行
春回大明朝
姑娘不必设防,我是瞎子
蒸饺子粘锅不了怎么办
排骨盐放多了怎么办
沙拉酱打稀了怎么办
沙拉酱太稠怎么办
西芹花生米怎么办
香肠咸了怎么办
豆腐皮怎么办凉菜好吃
凉拌菜醋放多了怎么办
面馆营业执照怎么办
开面馆营业执照怎么办
宝宝排便困难怎么办
婴儿排便困难怎么办
不锈钢锅糊底了怎么办
冷面冻了怎么办
卤菜店营业执照怎么办
醋泡鸡爪太酸了怎么办
高压锅煮粥溢锅怎么办
高压锅溢锅怎么办
不绣钢锅被烧黑了怎么办
爆米花机糊锅怎么办
剁椒放多了怎么办
嘴唇长水泡怎么办
嘴唇上嘴皮长泡怎么办
红豆馅煮稀了怎么办
红豆馅太稀了怎么办
红豆馅水多了怎么办
电压锅打不开盖怎么办
没有菜单点菜怎么办
c1工作证怎么办
月经太少是怎么办
灯光吸引虫子怎么办
excel表格不见了怎么办
显示setmenu怎么办
月经前睡不着怎么办
考生睡不着怎么办
高考焦虑怎么办
高考紧张睡不着怎么办
考试前一晚没睡怎么办
高考生失眠怎么办
明天要考试怎么办?
半夜孕吐睡不着怎么办