在这个高度投票的answer中关于C ++和Java之间性能差异的问题我了解到JIT编译器有时能够更好地进行优化,因为它可以确定机器的确切细节(处理器,缓存大小)等等):
通常,C#和Java可以像JIT一样快速或快速 编译器 - 第一次编译IL的编译器 执行 - 可以优化C ++编译的程序不能 因为它可以查询机器。它可以确定机器是否 英特尔或AMD; Pentium 4,Core Solo或Core Duo;或者如果支持SSE4, 等
C ++程序必须事先通过混合编译 优化使它在所有机器上运行得相当好,但是 没有尽可能多地优化单一配置(即 处理器,指令集,其他硬件)。
问题:有没有办法告诉编译器专门针对我当前的机器进行优化?有没有能够做到这一点的编译器?
答案 0 :(得分:9)
对于GCC,您可以使用标记-march=native
。请注意,生成的代码可能无法在其他CPU上运行,因为
GCC使用此名称来确定它可以发出的指令类型 生成汇编代码时。
因此可以生成CPU特定的程序集。
如果您希望代码在其他CPU类型上运行,但是为了在CPU上获得更好的性能进行调整,那么您应该使用-mtune=native
:
指定要调整其性能的处理器名称。该 代码将被调整为好像目标处理器属于该类型 在此选项中指定,但仍使用与之兼容的指令 目标处理器由-mcpu =选项指定。
答案 1 :(得分:4)
当然可以指示编译器针对特定体系结构进行优化。如果您查看可以传入的大量architecture flags,那么gcc就是如此。在Visual Studio上也是如此,因为它具有-MACHINE选项和{{3选项。
但是,与Java不同,这可能意味着生成的代码仅(安全)在目标硬件上运行。在一般编译的C ++代码的情况下,Java可以同样快或更快的断言。鉴于目标体系结构,为特定体系结构编译的C ++代码可能比同等Java代码快或快。当然,以这种方式支持多种架构还有很多工作要做。