【问题标题】:Role of pointers in C and Fortran in determining program speedC 和 Fortran 中指针在确定程序速度中的作用
【发布时间】:2018-10-20 08:47:21
【问题描述】:

我的理解是 Fortran(90 之前)非常快,部分原因是它不允许指针别名(因此允许更好的编译器优化)。但是,我也知道 C 系列语言中的指针允许程序员编写极快的代码。

我不明白为什么这两种语言会因为相反的原因而快速。任何人都可以了解发生了什么吗?

提前致谢。

【问题讨论】:

  • 请参阅非常相关的问题stackoverflow.com/q/146159/2737715。我很想把这个作为副本关闭。
  • 两种语言都快的原因是抽象级别低——这意味着“未知”数据结构或内存管理的开销为零。指针别名是处理优化编译器无法为缓存变量做出某些决定的一个小问题。
  • 您无法比较语言的速度。一种语言的程序没有速度。只有特定的编译器或解释器有。我会反对重复关闭的诱惑。另一个问题是关于这种差异的,并且包含许多可供选择的答案,通常来自对 Fortran 不太了解的人。 (而且我不得不对其中许多人投反对票。)
  • 将 20 年前的 C 与 30 年前的 Fortran 进行比较似乎毫无意义。 C 的某种专有方言保留了一些旧的限制,但无论您真正关心的是什么,这似乎都是次要的。
  • 我认为这是一个合理的问题,因为如果真的有这样的事情,它会引出一个“正确的问题”。诚然,在过去十年左右的时间里,SO 上也有类似的帖子,但每个帖子都为讨论增添了一些内容。无论如何,对于我们这些还不知道“答案”的人来说,这很有趣,正如您从高观看次数中看到的那样。

标签: c performance pointers fortran fortran77


【解决方案1】:

讨论语言速度,特别是优化效率,确实具有误导性。

让我们开始说,每种语言都是为了简化编程场景的某些特定方面而创建的,因此,程序员的首要目标是为正在编写的应用程序的功能选择正确的语言。

这是第一点,然后考虑到现在编译器编程使用标准化工具和定义良好的流程,从源转换为中间表示开始,编译链的其余部分将在该中间表示上起作用,包括优化器。后者恰好对于几乎所有语言都是相同的,因此期望得到相同的结果是现实的。

查看 mos 扩散编译器系列,例如 GCC https://gcc.gnu.org/、LLVM https://llvm.org/,甚至 .net https://en.wikipedia.org/wiki/.NET_Framework,可以看到实际示例。

因此,可以产生影响的出发点是语言如何以中间形式翻译,以便更好地展示编译器链的优化阶段。这不仅取决于翻译阶段的质量,还取决于语言的抽象级别。

我们通常认为语言的抽象程度越低,即机器汇编程序,优化越好。 这绝对是错误的! 除非你是一个优秀的汇编程序员,否则对于非常糟糕的汇编代码编写是无能为力的。

恰恰相反,正是高抽象层同意编译器以更有效的方式翻译代码,并以最可行的形式呈现给优化器。

Fortran 和 C 处于非常不同的抽象级别,第一个足够紧密以暗示标准,因此众所周知且预先优化的代码,第二个是广泛传播的语言,可以使用指针触及非常低的级别甚至是内联汇编程序,或者在不滥用任何副作用的情况下使用高级别的。

无论如何,最后的 C99-C11 标准引入了更多的语言限定符,这些限定符也允许使用 restrict 限定符对齐一些众所周知的缺陷,例如 不透明指针 (https://en.wikipedia.org/wiki/Opaque_pointer)。在当前的编译器中,现代 CPU(SIMD、SSE2 等)上可用的流指令的矢量化、使用也被广泛传播。 IE。对于 X86-64 平台,英特尔 C/C++ 编译器是最高效的编译器/优化器。

那么我们对未来的期望是什么?随着编译器技术的进步,我们应该期待任何差异的渐近归零。

为了进一步阅读,您还可以找到关于计算机科学堆栈交换的优秀答案:https://scicomp.stackexchange.com/questions/203/what-makes-fortran-fast

【讨论】:

    猜你喜欢
    • 2018-11-15
    • 1970-01-01
    • 1970-01-01
    • 2019-01-03
    • 2019-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-21
    相关资源
    最近更新 更多