0

我正在使用物理建模。本例中的模型是用 C 编写的。当我调用模型时,我通常是从 Ada 中调用的。但是,我也尝试用 C 语言编写它,我注意到当我使用 Ada 时,模型的执行时间比使用 C 语言要多大约 30%!

有人可以解释为什么会这样吗?为什么艾达需要更长的时间。我想指出,Ada 中调用模型的主例程除了调用模型并将数据移动到大约 100 个元素的输入数组之外什么都不做。此外,模型本身的计算量很大,因此 30% 的差异非常显着。

在这两种情况下也使用相同的编译标志。当主例程用不同的语言编写时,是否应该期望有所不同。如果是这样,为什么?

4

2 回答 2

1

鉴于我们目前掌握的信息,任何答案都是猜测;但这里有一个猜测:

在某些操作系统(尤其是 Debian 和目前的衍生系统)上,Gnat 的默认安装是与默认 gcc 本身不同的 gcc 版本(gcc-4.6)。或者,如果您下载了Gnat Libre Edition 2012,它将在您系统自己的 gcc 旁边安装自己的 gcc 版本。

在任何一种情况下,构建组合的 Ada/C 程序(例如使用 Gnatmake)可能使用了与纯 C 构建不同的 C 编译器版本;在这种情况下,速度差异很可能完全取决于不同的 C 编译器版本!

要测试这个假设,您可以 (a) 准确找出您正在使用的编译器版本 - 并在问题中命名它们!- 并且 (b) 强制纯 C 版本使用相同的编译器版本构建(例如使用 CC=gcc-4.6 标志) - 如果这是问题所在,速度差异将消失。

我的解决方案 - 这很重要 - 是从源代码构建一个新的 gcc(我目前正在使用 4.7.2),使用 --enable-languages=ada,c,c++

但是可能还有其他解决方案 - 例如,您可能需要不同的编译标志来选择相同的实际行为;不同 C 编译器版本的文档应该提供一些线索。

或者稍等片刻升级;Debian 计划将他们的 Gnat 版本重新与 gcc 的其余部分同步。有一个关键的 Ada/C 应用程序通过不兼容(具有讽刺意味的是,在其 C 部分和较新的 GCC 版本之间!)阻碍了这一过程,但该应用程序现已更新。

于 2013-02-06T12:38:21.227 回答
-1

没有一些例子,我不能说为什么。最可能的解释是代码的翻译更像是音译——因此很可能围绕 C 的低级特性进行了优化,其中包括别名倾向。

数组不应该被复制,因为 Ada 编译器足够聪明,可以在后台通过引用传递。一件可能但不应该让你慢下来的事情是 C 和 Ada 之间的接口。


当主例程用不同的语言编写时,是否应该期望有所不同。如果是这样,为什么?

这在很大程度上取决于例程的编写方式——如果编写它是为了利用依赖于实现的特性,那么即使在原始语言中也不能 [保证] 做同样的事情......所以我们不能,在最一般的情况,假设我们应该期望例程的时间在另一种语言中是相同的。

因此,只有在不依赖于任何实现的特质时,您的问题才有意义。

于 2013-02-05T14:54:31.190 回答