【问题标题】:Javascript port of C# BitConverter.DoubleToInt64BitsC# BitConverter.DoubleToInt64Bits 的 Javascript 端口
【发布时间】:2014-02-14 21:48:28
【问题描述】:

这个问题与this有关,但是因为我尝试优化功能以提高速度,所以我作为一个新问题提出这个问题。

我正在将新的 floats Clipper library 从 Angus Johnson 翻译成 Javascript,并且有一个函数 IsAlmostEqual,它使用 Ulps 技术比较双精度数是否相等。

原来的C#函数在这里:

公共静态布尔IsAlmostEqual(双A,双B) { //http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm 常量 int maxUlps = 10000; Int64 aInt = BitConverter.DoubleToInt64Bits(A); if (aInt aInt != bInt -maxUlps) || (sub > 0 && sub

还有我的翻译(JSBIN):

var IsAlmostEqual_Ulps = 函数(A,B) { DoubleToInt64Bits(A, aInt); 如果(aInt.hi

根据 83 个样本值,我的 Javascript 版本似乎可以正常工作,但问题是速度慢,主要来自 DoubleToInt64Bits 函数。当代码作为独立的 html(JSBIN 之外)执行时,总运行时间约为 2267 毫秒,其中DoubleToInt64Bits 需要 983 毫秒。

有问题的(=慢)DoubleToInt64Bits 在这里:

函数 DoubleToInt64Bits(A, xInt) { (新的 Float64Array(buf))[0] = A; xInt.lo = (new Uint32Array(buf))[0] | 0; xInt.hi = (new Int32Array(buf))[1] | 0; }

有什么方法可以让DoubleToInt64Bits 更快?

【问题讨论】:

    标签: c# javascript double int64


    【解决方案1】:

    DataView 是一个更适合从缓冲区读取不同类型的类,而不是在缓冲区上创建不同类型的数组。这是您的DoubleToInt64Bits 方法重写为使用DataView

    function DoubleToInt64Bits(A, xInt)
    {
        var dataView = new DataView(buf);
        dataView.setFloat64(0, A);
        xInt.lo = dataView.getUint32(4) | 0;
        xInt.hi = dataView.getInt32(0) | 0;
    }
    

    这将我的运行时间从 ~1500ms 缩短到 ~850ms。

    【讨论】:

    • 非常感谢!在原始代码中DoubleToInt64Bits 需要 800-1000 毫秒。使用您的版本需要 0-6 毫秒。
    猜你喜欢
    • 1970-01-01
    • 2010-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-16
    • 2011-01-04
    相关资源
    最近更新 更多