当前位置: 首页 > 面试题库 >

如何禁用V8的优化编译器

杨甫
2023-03-14
问题内容

我正在编写一个常量字符串比较函数(用于node.js),并且想为此功能禁用V8的优化编译器;使用命令行标志是不可能的。

我知道,使用with{}(或try / catch语句)块将禁用优化编译器 现在 ,但恐怕这个“功能”(错误)将被固定在未来的版本。

是否有一种不可变(且已记录)的方式来禁用V8的优化编译器?

示例功能:

function constantTimeStringCompare( a, b ) {
    // By adding a `with` block here, we disable v8's optimizing compiler.
    // Using Object.create(null) ensures we don't have any object prototype properties getting in our way.our way.
    with ( Object.create( null ) ){
        var valid = true,
            length = Math.max( a.length, b.length );
        while ( length-- ) {
            valid &= a.charCodeAt( length ) === b.charCodeAt( length );
        }
        // returns true if valid == 1, false if valid == 0
        return !!valid;
    }
}

性能测试只是为了好玩。


问题答案:

如果您想要可靠的方法来执行此操作,则需要使用--allow-natives-syntaxflag 运行node 并调用此方法:

%NeverOptimizeFunction(constantTimeStringCompare);

请注意,您应该在调用之前先调用此constantTimeStringCompare函数,如果函数已经优化,则违反了断言。

否则,with声明是您最好的选择,因为使其变得乐观可能是绝对的谬论,而支持则try/catch是合理的。您虽然不需要它来影响您的代码,但这已足够:

function constantTimeStringCompare( a, b ) {
    with({});

    var valid = true,
        length = Math.max( a.length, b.length );
    while ( length-- ) {
        valid &= a.charCodeAt( length ) === b.charCodeAt( length );
    }
    // returns true if valid == 1, false if valid == 0
    return !!valid;

}

仅提及with语句会破坏整个包含的函数-优化是在函数级粒度上完成的,而不是针对每个语句。



 类似资料:
  • stackoverflow上的几个线程(例如这一个)讨论了不同的优化级别(、、...)在编译Swift应用程序时。 然而,那些帖子与OSX上的开发有关。这些优化似乎可以直接通过Xcode或xcrun()设置。 我想知道在Linux(Ubuntu15.10)上直接使用Swift编译器时,如何切换不同的优化级别。目前,我只是通过调用来构建应用程序,如文档中所示,但我发现没有办法不更改优化级别。

  • 问题内容: 假设我在C代码中有类似的内容。我知道您可以使用a 代替,以使编译器不对其进行编译,但是出于好奇,我问编译器是否也可以解决此问题。 我认为这对于Java编译器来说更为重要,因为它不支持。 问题答案: 在Java中,if内的代码甚至都不是已编译代码的一部分。它必须编译,但不会写入已编译的字节码。它实际上取决于编译器,但我不知道没有对它进行优化的编译器。规则在JLS中定义: 优化的编译器可能

  • 如果关闭了编译器优化(gcc-o0...),那么说'volatile'关键字没有区别是可以的吗? 我制作了一些示例“C”程序,并且仅当打开编译器优化时,才在生成的汇编代码中看到易失性和非易失性之间的区别,即((gcc-o1....)。

  • 本文向大家介绍C#中尾递归的使用、优化及编译器优化,包括了C#中尾递归的使用、优化及编译器优化的使用技巧和注意事项,需要的朋友参考一下 递归运用 一个函数直接或间接的调用自身,这个函数即可叫做递归函数。 递归主要功能是把问题转换成较小规模的子问题,以子问题的解去逐渐逼近最终结果。 递归最重要的是边界条件,这个边界是整个递归的终止条件。 上面是个经典阶乘函数的实现。这里分2步: 1.转换,把10的阶

  • 问题内容: 我正在对进行一些性能测试,我想衡量内部函数使用的影响。 我想在不进入解释模式的情况下对某些方法禁用内部函数。有没有办法做到这一点 ?谢谢 问题答案: 用 例如 正如@apangin所注意到的,您可以首先使用它来查看测试中实际上包含哪些方法并将其禁用。

  • 不久前有人问了一个有趣的问题: 我决定证明使用Java8流API(确切地说是并行流)是可能的。以下是我的代码,它在非常罕见的情况下工作: 然后我想,也许是因为潜在的JIT编译器优化?因此,我尝试使用以下VM选项运行代码: 我禁用了JIT,成功案例的数量显著增加! 即时编译器如何优化并行流,以便优化可能会影响上述代码的执行?