免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: alazer
打印 上一主题 下一主题

[C] 在函数中频繁定义大的数组会不会影响速度? [复制链接]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
21 [报告]
发表于 2008-01-10 13:26 |只看该作者
原帖由 zszyj 于 2008-1-10 12:27 发表

主要与操作系统有关. 例如跑在PC上的, SCO UNIXWARE, 就是64k.
在DOS下,也是64k.
windows下, 你可以试试在线程内分配,到底是多少没测试过, 如果有清楚的请告知.


2.6内核LINUX
默认栈内存上限是10M字节
每线程可以用大约8MB临时变量

论坛徽章:
1
双子座
日期:2015-01-04 14:25:06
22 [报告]
发表于 2008-01-10 13:35 |只看该作者
原帖由 converse 于 2008-1-10 11:35 发表
我一般尽量避免编写这种频繁分配变量空间的代码,比如说

一个循环中
for()
{
    data t = XXX;
}

我写为:
data t;
for()
{
   t = XXX;
}

不知道编译器优化会不会做到这个

论坛徽章:
0
23 [报告]
发表于 2008-01-10 14:55 |只看该作者
原帖由 yecheng_110 于 2008-1-10 13:35 发表

不知道编译器优化会不会做到这个

至少我在aix中测试过,不会,
而且,事实上两种写法语义上是不一样的,虽然两种写法的变量生存域是一样的,都是当前函数生命周期内,但第二种写法变量的可见域只局限在循环体内,优化器是不应该将其优化成第一种写法的,因为第一种写法中变量的可见域扩展到循环体之外了,这是违反程序设计的原意的.

论坛徽章:
0
24 [报告]
发表于 2008-01-10 16:03 |只看该作者
windows上默认也是10M 的 栈

论坛徽章:
0
25 [报告]
发表于 2008-01-10 16:28 |只看该作者
不会.

速度不随FUNCTION内定义的数据大小而变化.
开一个10 BYTES的ARRAY 和1000 的速度一样.

论坛徽章:
0
26 [报告]
发表于 2008-01-10 17:12 |只看该作者
windows api在创建线程的时候通过参数指定堆栈大小。
我一般都定4096字节的.....个人习惯。也有人喜欢定的比较大。

单纯从效率上来分析:
堆栈变量的好处
1当前堆栈的cache命中(hit)非常高,因为对堆栈内存的访问,时间局部性和空间局部性都非常好,所以栈顶那一段内存在cache里面的概率远高于全局变量和堆内存区。      
例如:
void func()
{
  int a;
}
当我们执行call func的时候,返回地址压栈,这时可以保证:返回地址一定会进入到cache中(有可能原先已经在了,有可能是当时加载的)。
只要a和返回地址在同一个cache line中,就可以保证a也在cache中。
所以说栈中变量第一次被访问时的的cache命中率要远高于其它变量。
其它变量的第一次访问通常是cache miss的,而栈变量的第一次访问通常是cache hit的。(第二次基本都是cache hit了)

但是对于大型变量来说,这个好处就不明显了。因为cache line通常只有32字节,就算再大,也不可能到1K,所以大型变量的访问,只有一开始那一点点能够直接cache hit,后面的部分还是得老老实实的来。

2分配和释放时开销非常小
一个函数内所有临时变量的分配和释放只需要push mov sub mov pop5条指令。
malloc分配需要耗费较多的时间和空间,有兴趣的可以去看<c++内存管理算法与分析>。

但是对于大型数组。因为数组本身占用的内存和需要处理的时间比较大,所以相对来说,malloc的消耗所占的比例也比较小。

论坛徽章:
0
27 [报告]
发表于 2008-01-10 22:11 |只看该作者
原帖由 converse 于 2008-1-10 11:35 发表
我一般尽量避免编写这种频繁分配变量空间的代码,比如说

一个循环中
for()
{
    data t = XXX;
}

我写为:
data t;
for()
{
   t = XXX;
}


写在循环内并不是每次循环都重新分配数据空间的. 两个情况对变量 t 分配次数是一样的, 都是一次.

[ 本帖最后由 pzz68 于 2008-1-10 23:01 编辑 ]

论坛徽章:
0
28 [报告]
发表于 2008-01-11 02:28 |只看该作者
我认为会明显的影响速度,因为破坏了数据访问的局部性,可能会影响 虚拟内存换入换出的决策以及cache的使用,我觉得如果函数经常需要这样大的数组很有可能是代码的结构有问题。。。

论坛徽章:
0
29 [报告]
发表于 2008-01-11 03:01 |只看该作者
原帖由 mingyanguo 于 2008-1-11 02:28 发表
我认为会明显的影响速度,因为破坏了数据访问的局部性,可能会影响 虚拟内存换入换出的决策以及cache的使用,


这点倒是没想过

论坛徽章:
0
30 [报告]
发表于 2008-01-11 03:02 |只看该作者
原帖由 converse 于 2008-1-10 11:35 发表
我一般尽量避免编写这种频繁分配变量空间的代码,比如说

一个循环中
for()
{
    data t = XXX;
}

我写为:
data t;
for()
{
   t = XXX;
}


反对, 变量用时才定义是基本原则。效率的事情留给编译器。
不能做这种优化的编译器在这个时代有点说不过去了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP