一个有趣的问题(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)哪个的效率更高?为什么?

...全文
74 27 打赏 收藏 转发到动态 举报
写回复
用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)
内容概要:本文针对多渗透率电动汽车接入对配电网造成的影响,系统性地研究了其承载能力的评估方法,提出了一套融合多类型分布式能源的综合性评估体系。研究首先建立了包含配电网、电动汽车、分布式光伏及静止无功补偿装置(SVC)的协同运行基础模型,并据此构建了涵盖一次设备安全、负荷平稳性、电能质量与系统效率四个维度的多维评价指标体系。为实现客观、全面的量化评估,采用基于熵权法的客观赋权与模糊综合评价相结合的双层评分模型,有效避免了主观赋权的偏差,增强了评估结果的科学性与可信度。通过典型算例仿真,系统分析了不同电动汽车渗透率水平下各指标的演变规律,并开展了指标灵敏度分析,验证了所提评估模型的有效性、合理性和鲁棒性。; 适合人群:具备电力系统、电气工程及其自动化等相关专业背景,熟悉Matlab编程与电力系统仿真工具,从事新能源并网、智能配电网规划、电动汽车充放电管理等领域研究的研究生、高校科研人员及电网公司、设计院的工程技术人员。; 使用场景及目标:① 用于定量评估城市或区域配电网在不同电动汽车发展规模下的接纳能力与安全裕度;② 为电网规划部门制定充电基础设施布局、配电网升级改造方案提供决策依据;③ 支持研究高比例可再生能源与电动汽车耦合对电网稳定性的影响,优化负荷管理与无功补偿策略。; 阅读建议:建议读者结合文中的Matlab代码,动手复现算例仿真过程,深入理解熵权法计算权重与模糊综合评价的实现逻辑,并尝试调整电动汽车渗透率、光伏出力等关键参数,观察评价结果的变化趋势,从而深刻掌握模型的内在机理与应用方法。
内容概要:本文系统研究了分布式光伏储能系统的优化配置方法,重点聚焦于多渗透率电动汽车接入背景下配电网承载能力的评估问题。研究构建了涵盖配电网基础架构、电动汽车充放电行为、分布式光伏出力特性及无功补偿设备运行的协同仿真模型,并建立了集成设备安全、负荷特性、电能质量和系统效率的多维评价指标体系。创新性地提出基于熵权法与模糊综合评价相结合的双层评分模型,实现对承载能力的客观赋权与科学量化评估。通过Matlab平台进行算例仿真,分析不同电动汽车渗透率下的系统运行特性,开展关键指标的灵敏度分析,验证了方法的有效性与鲁棒性,为高比例新能源与电动汽车融合发展的配电网规划、优化调度及储能配置提供了理论支撑与技术工具。; 适合人群:电力系统、新能源、智能电网、综合能源系统及相关领域的科研人员、高校研究生以及从事电网规划与运行的工程技术人员。; 使用场景及目标:①用于研究高比例分布式光伏与规模化电动汽车接入对配电网运行特性的综合影响;②为配电网承载能力的科学评估、储能系统的优化配置及电网升级改造提供决策支持;③支持相关领域课题研究、学术论文复现、毕业设计及工程项目方案论证。; 阅读建议:建议结合提供的Matlab代码进行仿真复现,深入理解熵权法计算指标权重与模糊综合评价的实现细节,通过调整电动汽车渗透率、光伏出力水平等关键参数进行多场景对比和敏感性分析,以全面掌握系统运行规律与评估模型的内在逻辑。
内容概要:本文针对传统三电平并网逆变器在谐波抑制、电网不平衡适应性及动态响应方面的不足,提出了一种基于有源中点箝位(ANPC)三电平拓扑的高性能并网控制体系。该体系融合双极性倍频脉宽调制(DPWMA)、正负序分离锁相控制与电网电压前馈控制三大核心技术,构建了“精准同步-扰动补偿-优质调制”的一体化控制架构。ANPC拓扑通过有源箝位器件实现开关损耗均衡与中点电位主动调控,显著提升系统效率与稳定性;DPWMA调制在不增加器件开关频率的前提下,使输出等效开关频率翻倍,有效降低低次谐波含量,提升波形质量;正负序分离锁相技术可精准提取电网正序分量,抑制负序扰动对锁相精度的影响,保障不平衡电网下的稳定并网;电网电压前馈控制则打破传统反馈控制的滞后局限,实现对电网扰动的快速预补偿,大幅提升系统动态响应能力与抗扰性能。通过多工况仿真验证,该复合控制策略在稳态运行、电网不平衡及动态扰动等场景下均展现出优异的电能质量、锁相精度与运行稳定性,适用于新能源发电、工业大功率变流等对并网性能要求严苛的应用场合。; 适合人群:电力电子、新能源并网、自动控制及相关领域的科研人员与工程技术人员,以及具备一定电力系统分析与控制理论基础的研究生或高年级本科生。; 使用场景及目标:①研究高电能质量、高可靠性的三电平并网逆变器设计与控制方法;②解决电网电压不平衡、畸变等非理想工况下的并网稳定性问题;③提升大功率逆变系统的动态响应速度与抗干扰能力,推动高性能逆变技术在光伏、风电、储能等新能源系统中的应用。; 阅读建议:建议结合提供的Simulink仿真模型进行实践验证,重点掌握DPWMA调制的实现逻辑、正负序分离锁相算法的设计原理以及前馈-反馈复合控制结构的搭建方法,深入理解各模块间的协同工作机制,并通过对比不同工况下的仿真结果,全面评估控制策略的有效性与鲁棒性。

70,038

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧