Turbo Pascal 和 Turbo C 中的分析计算
Profiling computations in Turbo Pascal and Turbo C
我最近在为大学做一些任务,其中包括使用 Turbo Profiler(遗憾的是该软件在任务中隐式声明)来分析 Simpsons 数值积分的 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);
那么,real
和 double
(以及 integer
和 long
)之间的区别是什么,或者只是 Pascal 的编译器更擅长处理数学运算?
Don't believe those numbers. 如果你想测量时间,在最上面的子程序周围放置一个 10^6 或 10^9 迭代的循环,并计算秒数。如果您想查看该语句所占的时间比例,请使用堆栈采样。
Pascal 的REAL 就像C 中的FLOAT,是给定系统上最快的浮点类型的别名。
所以两个片段不等价,在 Pascal 中使用最优化的类型,而在 C 中硬编码双精度类型(如果我们忘记 80 位浮点数)
在 TP 中,真正的默认值意味着 48 位 软浮点,但在许多后来的程序中添加了 {$N+},将其映射到 x87 double。
我不太了解 Turbo C,但可能是你的(64 位)double 类型被模拟(取决于设置),这可以解释性能下降,因为显然是浮点模拟具有更多有效数字的值较慢。或者更糟的是,您在某处对硬件 FPU 与软件进行基准测试。
我最近在为大学做一些任务,其中包括使用 Turbo Profiler(遗憾的是该软件在任务中隐式声明)来分析 Simpsons 数值积分的 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);
那么,real
和 double
(以及 integer
和 long
)之间的区别是什么,或者只是 Pascal 的编译器更擅长处理数学运算?
Don't believe those numbers. 如果你想测量时间,在最上面的子程序周围放置一个 10^6 或 10^9 迭代的循环,并计算秒数。如果您想查看该语句所占的时间比例,请使用堆栈采样。
Pascal 的REAL 就像C 中的FLOAT,是给定系统上最快的浮点类型的别名。
所以两个片段不等价,在 Pascal 中使用最优化的类型,而在 C 中硬编码双精度类型(如果我们忘记 80 位浮点数)
在 TP 中,真正的默认值意味着 48 位 软浮点,但在许多后来的程序中添加了 {$N+},将其映射到 x87 double。
我不太了解 Turbo C,但可能是你的(64 位)double 类型被模拟(取决于设置),这可以解释性能下降,因为显然是浮点模拟具有更多有效数字的值较慢。或者更糟的是,您在某处对硬件 FPU 与软件进行基准测试。