(1) 不仅有可能,而且几乎每一代 x86 处理器都记录了它。回到 8088,继续前进,每一代人。对于当前主流应用程序和操作系统(包括 Linux),较新的处理器的时钟速度较慢。32 位到 64 位的转换没有帮助,更多的内核和更低的时钟速度使情况变得更糟。出于同样的原因,倒退也是如此。
(2) 依靠你的二进制文件失败或崩溃。有时你很幸运,大多数时候你没有。有新的指令是的,并且支持它们可能意味着捕获未定义的指令并对该指令进行软件仿真,这将非常缓慢并且缺乏对它的需求意味着它可能做得不好或根本不存在。优化可以使用新指令,但不仅仅是我猜你正在谈论的大部分优化与重新排序指令有关,这样各种管道就不会停止。因此,您将它们安排在一代处理器上速度很快,而在另一代处理器上它们会变慢,因为在 x86 系列中,内核变化太多。AMD 在那里运行了一段时间,因为他们会让相同的代码运行得更快,而不是试图发明新的处理器,最终在软件赶上时会更快。amd 和英特尔都在努力保持芯片运行而不崩溃,这不再是真的。
(3) 一般情况下,是的。例如 gcc 是一个糟糕的编译器,一种尺寸适合所有人,没有人适合,它永远不会也永远不会擅长优化。例如,gcc 4.x 代码在同一处理器的 gcc 3.x 代码上较慢(是的,所有这些都是主观的,这完全取决于正在编译的特定应用程序)。我使用的内部编译器比廉价或免费的编译器有了飞跃式发展(我在这里并不局限于 x86)。它们值这个价吗?就是那个问题。
一般来说,由于可怕的新编程语言和大量的内存、存储、缓存层,软件工程技能一直处于低位。这意味着能够使一个好的编译器更不用说一个好的优化编译器的工程师库随着时间的推移而减少,这种情况已经持续了至少 10 年。因此,即使是内部编译器也会随着时间的推移而退化,或者他们只是让员工致力于开源工具并为开源工具做出贡献,而不是拥有内部工具。同样的原因,硬件工程师使用的工具也在退化,所以我们现在有处理器,我们希望只是运行而不会崩溃,而不是尝试优化。有如此多的错误和芯片变化,大多数编译器的工作都是在避免这些错误。归根结底,gcc 单枪匹马地摧毁了编译器世界。
(4) 见上文 (2)。不要指望它。您想要运行它的操作系统可能无论如何都不会安装在较旧的处理器上,从而为您省去痛苦。出于同样的原因,为您的 pentium III 优化的二进制文件在您的 Pentium 4 上运行较慢,反之亦然。为在多核处理器上运行良好而编写的代码在单核处理器上的运行速度比在单核处理器上优化相同应用程序时要慢。
问题的根源在于 x86 指令集是可怕的。已经出现了如此多的高级指令集,它们不需要硬件技巧就可以使它们每一代都更快。但是wintel机器造成了两个垄断,其他的都无法进入市场。我的朋友一直提醒我,这些 x86 机器是微编码的,所以你真的看不到里面的指令集。更让我愤怒的是,可怕的 isa 只是一个解释层。这有点像使用 Java。只要英特尔保持领先地位,您在问题中概述的问题就会继续存在,如果替代品没有成为垄断者,那么我们将永远陷入 Java 模型中,您要么是公分母的一方,要么是另一方您在特定硬件上模拟通用平台,