当前位置: 首页 > news >正文

关于数组处理优化的一次讨论

这是二十几年前在上交大饮水思源BBS上关于数组处理优化的一次讨论。下面都是原帖,没有修改过。

【 原文由 MICROZC 所发表 】

标题: [转载] 一个关于循环的问题 下面两个过程,那个更加优化,为什么

int i,j;

for ( i=0; i<10000; i++)

     for ( j=0; j<50; j++)

         p[i][j] = 5*p[i][j];

int i,j;

for ( j=0; j<50; j++)

     for ( i=0; i<10000; i++)

         p[i][j] = 5*p[i][j];

【 在 beepbug 的大作中提到: 】

没实际试过。但是我想,具体试一种C编译器或许不能完整回答问题。从根本上看,似乎取决于C编译器是如何处理数组的。是行优先呢,还是列优先?如果全世界的C编译器全是一个德性,那无疑有唯一答案。如果两种都有,那答案便因编译器而异了。

【 在 rainycat 的大作中提到: 】

这个应该是固定的

例如:int a[3][4]是作为由3个4元数组构成的数组来处理的,这样a[3][0]和a[3][1]自然是相邻的。

我不记得这叫行优先还是列优先,总之跟fortran相反

【 在 beepbug 的大作中提到: 】

如果a[3][0]和a[3][1]是相邻的,便是列优先。反之,若a[1][2]和a[2][2]相邻,便是行优先。对于前者,应将行处理放在外循环,将列处理放在里面。对于后者,则相反。这样效率才高。

【 在 blueskyer 的大作中提到: 】

恩 这个倒是的确 不过不论是什么优先 总要有一个规律 可能最终的结论因编译器的实现而定 但是 具体遵循什么样的规律 还是有一定讨论的意义的

【 在 beepbug 的大作中提到: 】

可能是我没讲清这个道理。我说的就是规律。是因编译器的实现而异。确切地说,就是取决于所用的C编译器对数组的处理(物理存储结构)是行优先还是列优先。

(其中很多人跟帖,都表示要实际试一下。省略。)

【 在 beepbug 的大作中提到: 】

我很赞同哪位同学亲手做实验。只是想提醒一下,只在一种机器上的一种编译器上做实验,结果不能算是普遍真理。还有,在负荷很重的多用户UNIX主机上做要注意:由于O.S.的Nondeterminacy,结果会很搞笑。我曾在C-1小巨型机上重复做过类似题目。结果是个别几次竟然是相反结论。

【 在 phiobos 的大作中提到: 】

其实这个问题更多的取决于操作系统和CPU的内存操作策略而不是编译器

【 在 beepbug 的大作中提到: 】

你的数组不是O.S.管的。C编译器的linker为你的数组向O.S.申请一块空间。O.S.只管提供要求字节数的空间,而不管linker用作什么以及怎么用。O.S.也管数组,但那是它自己内部的数组。CPU的指令系统对数组的处理效率倒是有最大的影响。但是与这个问题的本义无关(这里是讨论哪一种快)。linker拿到空间后,便按这种C编译器的思路建立你的数组的物理存储结构。要么是行优先,要么是列优先。你顺着它做,效率就高。逆水行舟就费力。

这个问题值得讨论。因为它涉及到好多方面。软、硬皆有:数据结构的物理存储结构、存储空间的使用、编译器及其与O.S.的关系、O.S.的不确定性、指令系统、实验与结论的关系等等。

【 在 lippman 的大作中提到: 】

恩 数组不是系统管的 没错 但这个问题不是数组的问题了 主要是cache 命中率的问题还有内存分配的问题 这都是编译器无法染指的地方

【 在 beepbug 的大作中提到: 】

cache命中率不会改变快慢结果。它有影响,但是只是使快的更快,慢的更慢。没影响所讨论问题的结论。内存怎样分配对这个问题没关系。有关系的只是分配来的内存怎么使用。

当数组非常庞大时,数组的处理速度就影响程序的运行速度。这问题不仅仅是在C/C++里存在,在其它编程语言里也存在。要提高处理速度,光有数据结构和算法知识还不够,要了解你的数组的物理存储结构。

后来在水木清华BBS及XX部技术论坛上转贴过,用户名都是beepbug。

相关文章:

  • 使用Python可视化洛伦兹变换
  • LeetCode 打家劫舍+删除并获得点数
  • ROS机器人开发实践->机器人建模与仿真
  • 【Linux学习笔记】Linux的环境变量和命令行参数
  • LeetCode[232]用栈实现队列
  • Android学习之实战登录注册能力
  • 分布自定义shell脚本(详写)附带全代码
  • 【OC】AVPlayerLayer的学习
  • 深入解析主流数据库体系架构:从关系型到云原生
  • 从malloc到free:动态内存管理全解析
  • 【某比特币网址请求头部sign签名】RSA加密逆向分析
  • 在 Linux 上部署 .NET Core 应用并配置为开机自动启动
  • select、poll、epoll实现多路复用IO并对比差异
  • 家庭电脑隐身后台自动截屏软件,可远程查看
  • 十倍开发效率 - IDEA插件之 Maven Helper
  • QT常见输入类控件及其属性
  • SpringCloud小白入门+项目搭建
  • 秒杀抢购系统架构与优化全解:从业务特性到技术落地
  • 软考高级系统架构设计师-第13章 软件可靠性基础知识
  • 32-工艺品商城小程序
  • 豫章故郡,剑指演艺经济新高地
  • 《大家聊中国式现代化》明天全网推出
  • 重大虚开发票偷税骗补案被查处:价税2.26亿,涉700余名主播
  • 一周观展|上海,一系列特展大展渐次呈现
  • 甘肃古浪县发生3.0级地震,未接到人员伤亡和财产损失报告
  • 撤销逾千名留学生签证,特朗普政府面临集体诉讼