社区
C语言
帖子详情
一个有趣的问题(c语言高手请进)
GhostCoer
2003-12-12 12:01:39
(a):
for (i=0;i<10;i++)
for (j=0;j<10;j++)
a[i][j]=0;
(b):
for (j=0;j<10;j++)
for (i=0;i<10;i++)
a[i][j]=0;
问程序段(a)和(b)哪个的效率更高?为什么?
...全文
71
27
打赏
收藏
一个有趣的问题(c语言高手请进)
(a): for (i=0;i<10;i++) for (j=0;j<10;j++) a[i][j]=0; (b): for (j=0;j<10;j++) for (i=0;i<10;i++) a[i][j]=0; 问程序段(a)和(b)哪个的效率更高?为什么?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
27 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
ehom
2003-12-12
打赏
举报
回复
layman2008(eniac)给的是两段代码的反汇编结果,很明显指令基本一样,唯一的一点区别也不影响指令配对~~~效率应该一样
注意看赋值语句,这里就是取地址而已~~~
0040105E mov edx,dword ptr [ebp-4] ;取i的值
00401061 imul edx,edx,28h ;i=i*40,layman2008(eniac)应该是在Win32环境下定义的int,占4字节
00401064 lea eax,[ebp+edx-198h] ;[ebp-198h]取数组的首地址,[ebp+edx-198h]取第i行首地址,198h是408的16进制表示,10*10*4+2*4(2表示i,j占的栈空间)
0040106B mov ecx,dword ptr [ebp-8] ;取j的值
0040106E mov dword ptr [eax+ecx*4],0 ;取a[i][j]的地址
Edison621
2003-12-12
打赏
举报
回复
应该与行优先还是列优先有关
MooseWOler
2003-12-12
打赏
举报
回复
是trace的内容吧
UEAnswer
2003-12-12
打赏
举报
回复
layman2008(eniac) 你用的什么语言写得什么意思??看不懂,能说明一下么?
cpsoft
2003-12-12
打赏
举报
回复
是不是还要看编译器是怎么优化的?
19830711
2003-12-12
打赏
举报
回复
这要先计算机是行优先还是列优先
前者是A,后者是B高
arfi
2003-12-12
打赏
举报
回复
a[i][j] = *(*(a+i)+j)
都得执行加法与取地址运算,我认为效率上没什么区别
layman2008
2003-12-12
打赏
举报
回复
(a)-------
7: for (i=0;i<10;i++)
0040102E mov dword ptr [ebp-4],0
00401035 jmp main+30h (00401040)
00401037 mov eax,dword ptr [ebp-4]
0040103A add eax,1
0040103D mov dword ptr [ebp-4],eax
00401040 cmp dword ptr [ebp-4],0Ah
00401044 jge main+69h (00401079)
8: for (j=0;j<10;j++)
00401046 mov dword ptr [ebp-8],0
0040104D jmp main+48h (00401058)
0040104F mov ecx,dword ptr [ebp-8]
00401052 add ecx,1
00401055 mov dword ptr [ebp-8],ecx
00401058 cmp dword ptr [ebp-8],0Ah
0040105C jge main+67h (00401077)
9: a[i][j]=0;
0040105E mov edx,dword ptr [ebp-4]
00401061 imul edx,edx,28h
00401064 lea eax,[ebp+edx-198h]
0040106B mov ecx,dword ptr [ebp-8]
0040106E mov dword ptr [eax+ecx*4],0
00401075 jmp main+3Fh (0040104f)
00401077 jmp main+27h (00401037)
(b)-------
7: for (j=0;j<10;j++)
0040102E mov dword ptr [ebp-8],0
00401035 jmp main+30h (00401040)
00401037 mov eax,dword ptr [ebp-8]
0040103A add eax,1
0040103D mov dword ptr [ebp-8],eax
00401040 cmp dword ptr [ebp-8],0Ah
00401044 jge main+69h (00401079)
8: for (i=0;i<10;i++)
00401046 mov dword ptr [ebp-4],0
0040104D jmp main+48h (00401058)
0040104F mov ecx,dword ptr [ebp-4]
00401052 add ecx,1
00401055 mov dword ptr [ebp-4],ecx
00401058 cmp dword ptr [ebp-4],0Ah
0040105C jge main+67h (00401077)
9: a[i][j]=0;
0040105E mov edx,dword ptr [ebp-4]
00401061 imul edx,edx,28h
00401064 lea eax,[ebp+edx-198h]
0040106B mov ecx,dword ptr [ebp-8]
0040106E mov dword ptr [eax+ecx*4],0
00401075 jmp main+3Fh (0040104f)
00401077 jmp main+27h (00401037)
layman2008
2003-12-12
打赏
举报
回复
内存中 是这样存储的 a[0][0]a[0][1]...a[1][0]...a[9][9]
所以(a)是连续的给内存赋值
而(b)不是
所以应该是a高
lbaby
2003-12-12
打赏
举报
回复
个人觉得,这个要依据编译器的“聪明”程度而定
如果编译器足够“聪明”
--也就是说,编译器不管是行优先,还是列优先,都能按照最连续的方式访问内存-- 的话,上边的两段代码的效果是一样的
如果仅是和我们看到的c代码一样,
那么,最连续的访问方式将获得最好的时间效果
(由cache 的设计,最连续的访问方式会最大程度的减少cache失误)
visio
2003-12-12
打赏
举报
回复
认为(A)好些
好看些!!!
:)
mainSean
2003-12-12
打赏
举报
回复
觉得还是前一种!
eureka0891
2003-12-12
打赏
举报
回复
呵呵,
用一种方法试试,
把i,j都高为1000000000000;
然后去循环.....
zhtgong
2003-12-12
打赏
举报
回复
效率应该是一样的,时间复杂度是相同的
november5
2003-12-12
打赏
举报
回复
这个...
谁效率高不知道,
还是用memset吧
wangprince
2003-12-12
打赏
举报
回复
应该是a好了。
a对内存使用的更合理,避免了频繁访问。
其实这也要看对内存的管理方法,不过一般都是行优先!
WYlslrt
2003-12-12
打赏
举报
回复
我认为与编译器行优先和列优先有关,因为不同的计算机还要进行取地址如按行优先,那b就先给每列赋值,然后在从新去每行地址再赋值
ssunwind
2003-12-12
打赏
举报
回复
没什么区别 应该一样
phbzy
2003-12-12
打赏
举报
回复
看看他们在内存中是怎么排列的,其中一种肯定使的平凡的跳页(物理页),这种效率底点的
101monster
2003-12-12
打赏
举报
回复
呵呵,为什么不用Memset?这两种都是效率低下的写法。
加载更多回复(7)
UG 2023 64bit 64 位系统设计软件.rar
UG NX 2023(Unigraphics NX,中文名交互式 CAD/CAM 系统),是西门子 Siemens PLM Software 研发的 CAD/CAE/CAM 一体化产品工程解决方案,提供全套数字化造型与仿真验证手段。软件功能强悍,可轻松完成各类复杂实体、曲面造型构建,广泛应用于机械装备、塑胶模具、汽车零部件、航空航天、数控加工、钣金设计等工业领域。 软件仅支持 Win10、Win11 64 位系统,不再兼容 Win7,硬件配置要求适中。软件集三维建模、工程制图、数控编程、力学与运动仿真等功能于一体,可兼容各类主流设计文件格式。 该版本优化了装配加载速度、曲面建模能力与刀路算法,运行稳定,是当下行业主流版本。 由于安装包文件过大,CSDN 无法直接上传,附件提供下载链接及配套安装教程,欢迎下载使用。
vivado XADC IP核使用教程
vivado XADC IP核使用教程
64 位 NX2023 UG 主流行业版本 无偿持续分享.rar
UG(Unigraphics NX)是一款由西门子(Siemens PLM Software)开发的交互式CAD/CAM/CAE系统。作为全球领先的产品工程解决方案,它集成了产品设计、工程仿真与制造加工于一体。其功能强大且应用广泛,能够轻松实现各种复杂实体和造型的构造,为模具、汽车、航空航天及通用机械等行业提供了高性能的机械设计与制图灵活性。
【变压器的开路试验】变压器进行开路试验时的电路连接配置(Simulink仿真实现)
内容概要:本文详细介绍了利用Simulink进行变压器开路试验的电路连接配置与仿真实现方法,重点在于通过仿真手段还原实际电力系统中变压器在空载条件下的电气特性,从而深入理解其工作原理与性能表现。文章作为电力系统仿真系列研究的一部分,系统阐述了从电路模型搭建、参数设定、仿真运行到结果分析的完整流程,突出展示了MATLAB/Simulink在电力设备建模与教学科研中的强大功能与应用价值。; 适合人群:具备电力系统基础知识,熟悉MATLAB/Simulink仿真环境,从事电气工程、自动化及相关领域的研发人员,以及高年级本科生和研究生。; 使用场景及目标:①掌握变压器开路试验的基本原理与Simulink仿真建模的具体步骤;②通过仿真实验深入理解空载电流、铁芯损耗及励磁特性等关键参数的物理意义;③为后续开展变压器短路试验、暂态过程分析以及其他电力设备的仿真研究奠定理论与实践基础。; 阅读建议:建议结合Simulink软件动手实践,逐步构建并调试电路模型,重点关注各元件参数的设置方法与测量模块的应用技巧,同时推荐参考文中提及的其他相关仿真案例进行拓展学习,以全面提升对电力系统仿真实践的整体认知与操作能力。
SoloBlog.zip
SoloBlog.zip
C语言
70,038
社区成员
243,247
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章