免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12345下一页
最近访问板块 发新帖
查看: 13937 | 回复: 42
打印 上一主题 下一主题

[C] 很大的int数组值初始化为其index,如何做比较快呢? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-06-24 18:07 |只看该作者 |倒序浏览
  1. for(i=0;i<N;i++){
  2.   buf[i]= i;
  3. }
复制代码
因为这个缓冲很大,比如有一百万个值。
用并行来填吗?
我想找一种比较轻量级的比较简洁的效率还高的方法。

我觉得用openmp应该不错,但是现在是在串行效率上考虑,先不考虑并行

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
2 [报告]
发表于 2010-06-24 18:12 |只看该作者
buf怎么用?

直接buf[i] = -1(这一步调用memset,速度最快,内部用汇编写就)

用的时候if (buf[i] == -1) return i; else return buf[i];

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
3 [报告]
发表于 2010-06-24 18:13 |只看该作者
或者直接

int buf[N] = {};

用的时候

if (buf[i] == 0) return i; else buf[i];

也行,不过对buf[0]来说逻辑不太一样。

论坛徽章:
0
4 [报告]
发表于 2010-06-24 18:21 |只看该作者
buf是内部的还是外部的?
外部的话:
int buf[] = {0,1,2,3,4, ..., N};

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
5 [报告]
发表于 2010-06-24 18:24 |只看该作者
你可以用脚本生成源代码,然后再编译。虽然这样做程序会比较大,但是速度肯定是最快的

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
6 [报告]
发表于 2010-06-24 18:35 |只看该作者
因为这个缓冲很大,比如有一百万个值。
用并行来填吗?
我想找一种比较轻量级的比较简洁的效率还高的方法 ...
wuxb45 发表于 2010-06-24 18:07



    现在的机器,100W次基本感觉不到啥,这个初始化的时间与你使用这个数组的其他代码相比更不算啥了。

论坛徽章:
0
7 [报告]
发表于 2010-06-24 19:56 |只看该作者
本帖最后由 masonzhang 于 2010-06-24 19:57 编辑

巨型缓冲机制 必须是在硬件上做文章。

论坛徽章:
0
8 [报告]
发表于 2010-06-25 08:33 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
9 [报告]
发表于 2010-06-25 08:48 |只看该作者
如果这是做一遍的初始化,用循环就行了,偶尔的开销不会造成性能瓶颈。如果这是频繁的调用,可以在内存里存一份副本,需要时直接memcpy。

论坛徽章:
0
10 [报告]
发表于 2010-06-25 08:53 |只看该作者
根据你的机器cpu的核数开相应的线程,并把数组平均分配,比如四个核,就是四个线程,数组的长度为400万,则第一个线程初始化是0-100万,第二个线程初始化100万1-200万。。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP