stackoverflow上的几个线程(例如这一个)讨论了不同的优化级别(onone
、o
、ouncheck
...)在编译Swift应用程序时。
然而,那些帖子与OSX上的开发有关。这些优化似乎可以直接通过Xcode或xcrun(xcrun swift-o3
)设置。
我想知道在Linux(Ubuntu15.10)上直接使用Swift编译器时,如何切换不同的优化级别。目前,我只是通过调用swift build
来构建应用程序,如文档中所示,但我发现没有办法不更改优化级别。
可以向Swift编译器swiftc
提供-o
、-onone
和-ouncheck
优化标志。但是,目前似乎没有办法为swift build
指定其他标志。例如,请参见以下链接,尽管它没有直接相关:https://bugs.swift.org/browse/sr-397。同样的bug报告表明团队正在积极地添加这个缺失的功能。
我发现的一种解决此问题的方法是运行swift build-v
,找到引用-onone
的第一个命令,将它和所有跟随它的命令复制到shell脚本中,编辑脚本以使用所需的优化级别而不是-onone
,然后运行该脚本。这应该使用所需的优化级别重新编译Swift源代码,并重新构建可执行文件。
在我的测试中,我发现如果使用-o
或-ouncheck
而不是-onone
构建,那么一个涉及对数组排序的简单示例运行速度要快几个数量级。
问题内容: 我正在编写一个常量字符串比较函数(用于node.js),并且想为此功能禁用V8的优化编译器;使用命令行标志是不可能的。 我知道,使用(或try / catch语句)块将禁用优化编译器 现在 ,但恐怕这个“功能”(错误)将被固定在未来的版本。 是否有一种不可变(且已记录)的方式来禁用V8的优化编译器? 示例功能: 性能测试只是为了好玩。 问题答案: 如果您想要可靠的方法来执行此操作,则需
问题内容: 假设我在C代码中有类似的内容。我知道您可以使用a 代替,以使编译器不对其进行编译,但是出于好奇,我问编译器是否也可以解决此问题。 我认为这对于Java编译器来说更为重要,因为它不支持。 问题答案: 在Java中,if内的代码甚至都不是已编译代码的一部分。它必须编译,但不会写入已编译的字节码。它实际上取决于编译器,但我不知道没有对它进行优化的编译器。规则在JLS中定义: 优化的编译器可能
如果关闭了编译器优化(gcc-o0...),那么说'volatile'关键字没有区别是可以的吗? 我制作了一些示例“C”程序,并且仅当打开编译器优化时,才在生成的汇编代码中看到易失性和非易失性之间的区别,即((gcc-o1....)。
我在godbolt上编译这段代码。orgwith-O2和编译器不会使用一些memcpy对其进行优化,而是诚实地运行循环。 但是,如果我将“= src[i]”替换为“= 0”,他们会使用memset。但同样,当我用“ = 1”替换它时,它们会运行一个循环。当要设置的值不为零时,为什么它们会避免使用 memcpy 和 memset?我认为这是他们将执行的第一批优化之一。
不久前有人问了一个有趣的问题: 我决定证明使用Java8流API(确切地说是并行流)是可能的。以下是我的代码,它在非常罕见的情况下工作: 然后我想,也许是因为潜在的JIT编译器优化?因此,我尝试使用以下VM选项运行代码: 我禁用了JIT,成功案例的数量显著增加! 即时编译器如何优化并行流,以便优化可能会影响上述代码的执行?