2

我最近一直在为大学做一些任务,其中包括使用 Turbo Profiler(遗憾的是,该软件在任务中隐式声明)来分析 Simpson 数值积分的 C 和 Pascal 实现。我遇到了一个非常奇怪的案例,Pascal 比 C 快得多。

帕斯卡:

i: integer, lower: real, delta_x: real;
....
(0.0000 seconds) (30 times)         x:=lower+delta_x*(2.0*i-1.0);

C:

long i, double lower, double delta_x;
....
(0.0549 seconds) (30 times)         double x = lower + delta_x * (2.0 * i - 1.0);

那么,realdouble(和integerlong)之间的区别或者只是 Pascal 的编译器更擅长处理数学运算,这可能是什么?

4

2 回答 2

2

Pascal的REAL类似于 C 中的FLOAT,是给定系统上最快的浮点类型的别名。

所以这两个片段是不等价的,在 Pascal 中使用了最优化的类型,而在 C 中你硬编码 double,最高精度的类型(如果我们忘记了 80 位浮点数)

在 TP 中,真正的默认值表示48 位软浮点,但在许多后来的程序中添加了 {$N+},将其映射到 x87 双精度。

我不太了解 Turbo C,但可能是模拟了您的(64 位)双精度类型(取决于设置),这可以解释性能下降,因为显然模拟具有更多有效数字的浮点值速度较慢。或者更糟的是,您正在某处对硬件 FPU 与软件进行基准测试。

于 2016-11-05T14:44:32.873 回答
0

不要相信那些数字。如果要测量时间,请在顶部子程序周围放置一个 10^6 或 10^9 次迭代的循环,并计算秒数。如果您想查看该语句的时间比例,请使用堆栈采样。

于 2016-03-15T15:15:46.147 回答