社区
英特尔边缘计算技术
帖子详情
关于malloc或NEW在多线程下的效率
电力信息系统
2009-12-21 12:09:43
加精
//#pragma omp parallel for
for(int i=0;i<100000;i++)
{
malloc(sizeof(int)*1000);
}
单线程比用OPENMP快3倍,请问为何?
如何提高malloc或new 的效率呢?
...全文
706
21
打赏
收藏
关于malloc或NEW在多线程下的效率
//#pragma omp parallel for for(int i=0;i<100000;i++) { malloc(sizeof(int)*1000); } 单线程比用OPENMP快3倍,请问为何? 如何提高malloc或new 的效率呢?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
21 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
songlei217
2010-08-09
打赏
举报
回复
学习了!
maquan
2009-12-26
打赏
举报
回复
楼主这段程序,只用到了两项资源:
资源1:CPU
资源2:内存(包括 RAM、数据总线、地址总线)
在单线程的情况下,资源2已经满载,成为瓶颈。
多线程的运行方式,只是增加了资源1,并没有解决瓶颈,反而可能增加了线程切换、线程同步等额外开销。所以总的耗时反而增加了。
以上都是猜测,仅供批判。
建议楼主如果有条件有兴趣的话,试一下在启用多线程的同时也启用双通道内存,也许能有好的效果。果如此,则基本可以证实上述猜测。
iisbsd
2009-12-24
打赏
举报
回复
[Quote=引用楼主 zhouguoling 的回复:]
单线程比用OPENMP快3倍,请问为何?
如何提高malloc或new 的效率呢?
[/Quote]
我猜测openmp里面用到了锁以保证安全,所以就慢了。
liquanhai
2009-12-24
打赏
举报
回复
7楼很强,学习了!圣诞快乐!
cici_wang_
2009-12-24
打赏
举报
回复
看看~~~借楼主加分~~~~~~~~
ilyyyfn
2009-12-24
打赏
举报
回复
openmp里面不会加锁,原因是malloc或new内部包含了同步操作,像楼主这样的写法,造成剧烈的锁碰撞
受教了
gamedragon
2009-12-24
打赏
举报
回复
7楼的东西跟本贴一点关系都没有啊,还有这么多起哄的。
malloc应该是线程安全的,里面应该会有锁机制。
topzkz
2009-12-24
打赏
举报
回复
[Quote=引用 12 楼 iisbsd 的回复:]
引用楼主 zhouguoling 的回复:
单线程比用OPENMP快3倍,请问为何?
如何提高malloc或new 的效率呢?
我猜测openmp里面用到了锁以保证安全,所以就慢了。
[/Quote]
openmp里面不会加锁,原因是malloc或new内部包含了同步操作,像楼主这样的写法,造成剧烈的锁碰撞
csgdseed
2009-12-24
打赏
举报
回复
向7楼学习
zhyzdl
2009-12-23
打赏
举报
回复
study
yshuise
2009-12-23
打赏
举报
回复
TBB有专门的内存分配函数。
YHL27
2009-12-23
打赏
举报
回复
study!
xiao_rq
2009-12-23
打赏
举报
回复
强!就一个字!
sparkhoc
2009-12-23
打赏
举报
回复
关注
liangmaowu
2009-12-23
打赏
举报
回复
学习学习学习
luokaijie
2009-12-23
打赏
举报
回复
ding
sining520
2009-12-23
打赏
举报
回复
7楼强 学习了
liuyu9920
2009-12-23
打赏
举报
回复
学习学习。。。
CCCCCCCCCCCCCCC
2009-12-23
打赏
举报
回复
首先要说的是,使用 malloc 函数,请包含 stdlib.h(C++ 中是 cstdlib),而不是 malloc.h 。因为 malloc.h 从来没有在 C 或者 C++ 标准中出现过!因此并非所有编译器都有 malloc.h 这个头文件。但是所有的 C 编译器都应该有 stdlib.h 这个头文件。
在 C++ 中,强制转换 malloc() 的返回值是必须的,否则不能通过编译。但是在 C 中,这种强制转换却是多余的,并且不利于代码维护。
起初,C 没有 void 指针,那时 char* 被用来作为泛型指针(generic pointer),所以那时 malloc 的返回值是 char* 。因此,那时必须强制转换 malloc 的返回值。后来,ANSI C(即C89) 标准定义了void 指针作为新的泛型指针。void 指针可以不经转换,直接赋值给任何类型的指针(函数指针除外)。从此,malloc 的返回值变成了 void* ,再也不需要强制转换 malloc 的返回值了。以下程序在 VC6 编译无误通过。
#include <stdlib.h>
int main( void )
{
double *p = malloc( sizeof *p ); /* 不推荐用 sizeof( double ) */
free(p);
return 0;
}
当然,强制转换malloc的返回值并没有错,但画蛇添足!例如,日后你有可能把double *p改成int *p。这时,你就要把所有相关的 (double *) malloc (sizeof(double))改成(int *)malloc(sizeof(int))。如果改漏了,那么你的程序就存在 bug 。就算你有把握把所有相关的语句都改掉,但这种无聊乏味的工作你不会喜欢吧!不使用强制转换可以避免这样的问题,而且书写简便,何乐而不为呢?使用以下代码,无论以后指针改成什么类型,都不用作任何修改。
double *p = malloc( sizeof *p );
类似地,使用 calloc ,realloc 等返回值为 void* 的函数时,也不需要强制转换返回值。
参考资料:
ISO/IEC 9899:1999 (E) Programming languages — C 7.20.3.3 The malloc function
ISO/IEC 9899:1999 (E) Programming languages — C P104 (6.7.2.2)
gamedragon
2009-12-21
打赏
举报
回复
不用那么频繁的malloc
或
开一大块内存,自己管理,每个线程管自己那一堆
malloc
和
new
区别,进程与线程的区别
malloc
和
new
区别 1,
malloc
与free是C++/C语言的标准库函数,
new
/delete是C++的运算符。它们都可用于申请动态内存和释放内存。 2,对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于
malloc
/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构
C++_项目高并发内存池——优化-测试与查错Span链表中自由链表尾未置空--与
malloc
在
多线程
的情况下对比性能
测试代码: #include"ConcurrentAlloc.h" //ntimes:一轮申请与释放内存的此时 rounds:一共测试几轮 nworks线程数 void TestBenchMark
Malloc
(size_t ntimes, size_t rounds, size_t nworks) { std::cout << "
Malloc
Test" << std::endl; std::vector<std::thread>ThreadPool(nworks
替代系统
malloc
/
new
--选择合适的内存跟踪方案
替代系统自带的
malloc
/
new
原因无非两个: reason 1. 做内存profile或查找问题 reason 2. 自定义的分配方案提高性能 不过文章[1]中说明了,替代全局
new
不是一个好做法. 其实要达到以上两点目的,笔者认为用valgrind工具链就可以了。 解决方案: 1. 用valgrind和massif valgrind的memcheck...
malloc
,
new
,VirtualAlloc,HeapAlloc性能(速度)比较
http://www.cppblog.com/woaidongmao/archive/2011/12/02/153160.html 这里比较的VC++编译的C++代码中的性能 我用的是VC6.0测试的 就不介绍这几个的用法了 我写了一段简单的测试代码 测试结果是:
malloc
:390
new
:391 VirtualAlloc:454 HeapAlloc:47 很明显的是He
C++:
多线程
内存管理的思考
用 C++ 写
多线程
算法,如果程序设计过程中完全不用
new
、delete、
malloc
、free 等动态申请、释放内存,理论上讲,变量内存会完全分配在栈上。如果不用全局变量和指针引用,理论上讲,算法可以实现无锁设计。 但问题来了,如果算法用 OOP 方法设计,数据能保证是完全分配在栈上吗?
英特尔边缘计算技术
566
社区成员
7,027
社区内容
发帖
与我相关
我的任务
英特尔边缘计算技术
英特尔® 边缘计算,聚焦于边缘计算、AI、IoT等领域,为开发者提供丰富的开发资源、创新技术、解决方案与行业活动。
复制链接
扫一扫
分享
社区描述
英特尔® 边缘计算,聚焦于边缘计算、AI、IoT等领域,为开发者提供丰富的开发资源、创新技术、解决方案与行业活动。
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章