【问题标题】:How many lines of machine code are generated by one statement in programming language X?编程语言 X 中的一条语句生成多少行机器代码?
【发布时间】:2011-08-16 18:30:59
【问题描述】:

阅读一篇关于Lost Programming Skills的文章,作者提出了这个聊天:

我:你需要多少马力?
SE:我不知道。
我:让我们看看,你的主循环有多少行代码?
SE:10,000。
我:什么语言?
SE:Fortran
我:好的,每行 Fortran 大约有 10 行机器代码,所以 每个循环 100,000 条指令;循环每次执行多少次 第二个?
SE:每 1/20 秒。
我:好的,所以这是 20 x 100,000 = 2mops(这比我们拥有的任何东西都快 当时),也许我们最好重新考虑一下。

这让我想知道,现代语言的数字是多少,比如 Ruby?如何发现?

【问题讨论】:

  • 这取决于语言和机器架构。有些语言甚至不直接针对硬件。例如,Java 被编译成在虚拟机上运行的字节码。听起来他们在这里得到的是在优化代码之前评估代码。在实践中,您可以使用分析技术来查看哪些代码行占用的时间最多。
  • 你真的不能这样衡量事情,花时间去尝试是徒劳的。
  • 在 fortran 时代(不算我们在技术上仍处于 fortran 时代)你可以做这样的事情......
  • 死链接。现在可以在itworld.com/article/2740201/it-management/… 找到这篇文章

标签: compilation machine-code


【解决方案1】:

我不认为会有一个确切的数字。说“对于语言 x 编译的二进制文件每个源代码行有 y 行”。但如果你仍然想知道可能是你可以拿一个很大的不。编译的代码和相应的源代码,并找出每个源代码行的平均值。 您可以使用任何二进制编辑器打开二进制文件以查看它生成了多少行。例如。奥利给

【讨论】:

    【解决方案2】:

    就确定执行一段代码需要多长时间而言,这甚至不再适用于 Fortran!如果你用 Fortran 90 写这个:

    SUBROUTINE foo(x, y)
      IMPLICIT NONE
      REAL, DIMENSION(:), INTENT(IN) :: x
      REAL, DIMENSION(:), INTENT(OUT) :: y
      y = EXP(x)
    END SUBROUTINE foo
    

    表示y = EXP(x) 的行可能需要任意长的时间来执行,具体取决于数组xy 的大小。任何带有向量赋值的语言也是如此。

    【讨论】:

      【解决方案3】:

      在聊天中他们试图估计 CPU 性能。 如果您知道 CPU 性能和循环的执行时间,您可以获得每个循环然后每行的 CPU 命令数。 聊天中的计算并不精确。 即使对于 ruby​​,您也可以进行类似的不精确计算。 请注意,说一个 fortran 行是 10 个 CPU 命令但对于某些循环来说是平均的,这是错误的。

      估计你的循环在 ruby​​ 中花费的时间。 在循环时间上乘以 CPU 性能(每秒操作数)。您将获得每秒操作数。 将每秒操作数除以循环中的行数。这就是你的循环价值。

      【讨论】:

        【解决方案4】:

        对于 X="C#",您可能需要查看来自 Microsoft 的 Faster Managed Code: Know What Things Cost。它说,(特定的)现代语言在实际接触硬件之前已经过大量优化。

        【讨论】:

          猜你喜欢
          • 2023-03-13
          • 1970-01-01
          • 1970-01-01
          • 2010-09-10
          • 1970-01-01
          • 2012-03-18
          • 1970-01-01
          • 2018-06-23
          • 2012-11-27
          相关资源
          最近更新 更多