比lua更快的脚本luc

    2015年,写了一个C++语法的脚本,经过测试,性能比lua差太多,就没有继续。今年,闲来无事,继续研究,到底比lua慢在哪里?经过优化,重构,再次优化,再次重构,性能已经比lua快,差不多比lua快3倍的样子。

    测试例子,是循环很多次,计算开方、三次开方,结果如下图:

比lua更快的脚本luc

 

测试代码lua:

function LuaSqrt(x)

    a = x;
    x1 = 1;
    x2 = 2;

    while (x ~= 0 and (x2 <= 0.9999999999 or 1.0000000001 <= x2))
    do
        x1 = x;
        x = (x1*x1 + a) / 2 / x1;
        x2 = x / x1;
    end

    return x;
end;

function LuaSqrt3(x)

    a = x;
    x1 = 1;
    x2 = 2;

    while (x ~= 0 and (x2 <= 0.9999999999 or 1.0000000001 <= x2))
    do
        x1 = x;
        x = (x1*x1*x1 + a) / 2 / x1 / x1;
        x2 = x / x1;
    end

    return x;
end;

function TestCase()
    result = 0;
    result3 = 0;

    i = 0;
    loopCount = 1000000;
    --loopCount = 1000;
    sqrtSource = 22000000000.0;

    while (i < loopCount)
    do
        i = i + 1;
        result = LuaSqrt(sqrtSource);
        result3 = LuaSqrt3(sqrtSource);
    end

    print("result = " .. result .. "\tresult3 = " .. result3);
end
 

测试代码luc:


double LucSqrt(double x)
{
    double a = x;
    double x1 = 1;
    double x2 = 2;
    while (x!=0 && (x2<=0.9999999999 || 1.0000000001<=x2))
    {
        x1 = x;
        x = (x1*x1+a)/2/x1;
        x2 = x/x1;
    }

    return x;
}

double LucSqrt3(double x)
{
    double a = x;
    double x1 = 1;
    double x2 = 2;
    while (x!=0 && (x2<=0.9999999999 || 1.0000000001<=x2))
    {
        x1 = x;
        x = (x1*x1*x1+a)/2/x1/x1;
        x2 = x/x1;
    }

    return x;
}

void TestCase(void)
{
    double result = 0;
    double result3 = 0;

    int i = 0;
    int loopCount = 1000000;
    // int loopCount = 1000;
    double sqrtSource = 22000000000.0;

    while (i < loopCount)
    {
        i = i + 1;
        result = LucSqrt(sqrtSource);
        result3 = LucSqrt3(sqrtSource);
    }

    _tprintf(_T("result = %lf\t\tresult3 = %lf\r\n"), result, result3);
}

TestCase();