c++开方效率测试

cpp 复制代码
// ConsoleApplication1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>

#include <chrono>
#include <cmath>
#include <functional>

void math_test(std::function<float(float)> _function) {
    auto start = std::chrono::high_resolution_clock::now();
    float sum = 0.0f;
    for (float i = 1.0f; i <= 10000000.0f; ++i) {
        sum += _function(i);
    }
    auto end = std::chrono::high_resolution_clock::now();
    auto duration = std::chrono::duration_cast<std::chrono::microseconds>(end - start).count();
    std::cout << "总和: " << sum << std::endl;
    std::cout << "              耗时: " << duration << " 微秒" << std::endl;
}

void math_test_and(std::function<float(float&)> _function) {
    auto start = std::chrono::high_resolution_clock::now();
    float sum = 0.0f;
    for (float i = 1.0f; i <= 10000000.0f; ++i) {
        sum += _function(i);
    }
    auto end = std::chrono::high_resolution_clock::now();
    auto duration = std::chrono::duration_cast<std::chrono::microseconds>(end - start).count();
    std::cout << "总和: " << sum << std::endl;
    std::cout << "              耗时: " << duration << " 微秒" << std::endl;
}

inline float std_sqrt(float number)
{
    return 1.0f / std::sqrt(number);
}

inline float std_sqrt_and(float& number)
{
    return 1.0f / std::sqrt(number);
}

inline float q_sqrt(float number)
{
    long i;
    float x2, y;
    const float threehalfs = 1.5F;

    x2 = number * 0.5F;
    y = number;
    // 通过内存地址转换技巧,将浮点数的位模式直接转换为长整数,实现对浮点位的操作
    i = * (long*) &y;
    // 对数运算推导位操作公式
    i = 0x5f3759df - (i >> 1);
    y = * (float*) &i;
    // 牛顿法对初步近似结果进行一次迭代优化,将误差控制在1%以内
    y = y * (threehalfs - (x2 * y * y));
    return y;
}

inline float q_sqrt_and(float& number)
{
    long i;
    float x2, y;
    const float threehalfs = 1.5F;

    x2 = number * 0.5F;
    y = number;
    i = *(long*)&y;
    i = 0x5f3759df - (i >> 1);
    y = *(float*)&i;
    y = y * (threehalfs - (x2 * y * y));
    return y;
}

float q_sqrt_and_out(float& number)
{
    long i;
    float x2, y;
    const float threehalfs = 1.5F;

    x2 = number * 0.5F;
    y = number;
    i = *(long*)&y;
    i = 0x5f3759df - (i >> 1);
    y = *(float*)&i;
    y = y * (threehalfs - (x2 * y * y));
    return y;
}

inline float q_s_sqrt(float number)
{
    long i;
    float x2, y;
    const float threehalfs = 1.5f;

    x2 = number * 0.5f;
    y = number;
    i = * (long*) &y;
    i = 0x5f3759df - (i >> 1);
    y = * (float*) &i;
    y = y * (threehalfs - (x2 * y * y));
    y = y * (threehalfs - (x2 * y * y));
    return y;
}

inline float q_s_sqrt_and(float& number)
{
    long i;
    float x2, y;
    const float threehalfs = 1.5f;

    x2 = number * 0.5f;
    y = number;
    i = *(long*)&y;
    i = 0x5f3759df - (i >> 1);
    y = *(float*)&i;
    y = y * (threehalfs - (x2 * y * y));
    y = y * (threehalfs - (x2 * y * y));
    return y;
}

int main()
{
    std::cout << "Hello World!\n";

    math_test(std_sqrt);

    math_test(q_sqrt);

    math_test(q_s_sqrt);

    std::cout << "------------------------------------------" << std::endl;

    math_test_and(std_sqrt_and);

    math_test_and(q_sqrt_and);

    math_test_and(q_s_sqrt_and);

    std::cout << "------------------------------------------" << std::endl;

    auto start = std::chrono::high_resolution_clock::now();
    float sum = 0.0f;
    for (float i = 1.0f; i <= 10000000.0f; ++i) {
        sum += std_sqrt(i);
    }
    auto end = std::chrono::high_resolution_clock::now();
    auto duration = std::chrono::duration_cast<std::chrono::microseconds>(end - start).count();
    std::cout << "总和: " << sum << std::endl;
    std::cout << "              耗时: " << duration << " 微秒" << std::endl;

    start = std::chrono::high_resolution_clock::now();
    sum = 0.0f;
    for (float i = 1.0f; i <= 10000000.0f; ++i) {
        sum += q_s_sqrt(i);
    }
    end = std::chrono::high_resolution_clock::now();
    duration = std::chrono::duration_cast<std::chrono::microseconds>(end - start).count();
    std::cout << "总和: " << sum << std::endl;
    std::cout << "              耗时: " << duration << " 微秒" << std::endl;

    start = std::chrono::high_resolution_clock::now();
    sum = 0.0f;
    for (float i = 1.0f; i <= 10000000.0f; ++i) {
        sum += q_sqrt(i);
    }
    end = std::chrono::high_resolution_clock::now();
    duration = std::chrono::duration_cast<std::chrono::microseconds>(end - start).count();
    std::cout << "总和: " << sum << std::endl;
    std::cout << "              耗时: " << duration << " 微秒" << std::endl;

    start = std::chrono::high_resolution_clock::now();
    sum = 0.0f;
    for (float i = 1.0f; i <= 10000000.0f; ++i) {
        sum += q_sqrt_and(i);
    }
    end = std::chrono::high_resolution_clock::now();
    duration = std::chrono::duration_cast<std::chrono::microseconds>(end - start).count();
    std::cout << "总和: " << sum << std::endl;
    std::cout << "              耗时: " << duration << " 微秒" << std::endl;

    start = std::chrono::high_resolution_clock::now();
    sum = 0.0f;
    for (float i = 1.0f; i <= 10000000.0f; ++i) {
        sum += q_sqrt_and_out(i);
    }
    end = std::chrono::high_resolution_clock::now();
    duration = std::chrono::duration_cast<std::chrono::microseconds>(end - start).count();
    std::cout << "总和: " << sum << std::endl;
    std::cout << "              耗时: " << duration << " 微秒" << std::endl;

    start = std::chrono::high_resolution_clock::now();
    sum = 0.0f;
    for (float i = 1.0f; i <= 10000000.0f; ++i) {
        long _i;
        float x2, y;
        const float threehalfs = 1.5F;

        x2 = i * 0.5F;
        y = i;
        _i = *(long*)&y;
        _i = 0x5f3759df - (_i >> 1);
        y = *(float*)&_i;
        y = y * (threehalfs - (x2 * y * y));

        sum += y;
    }
    end = std::chrono::high_resolution_clock::now();
    duration = std::chrono::duration_cast<std::chrono::microseconds>(end - start).count();
    std::cout << "总和: " << sum << std::endl;
    std::cout << "              耗时: " << duration << " 微秒" << std::endl;
}
相关推荐
RuoZoe5 小时前
从 2026 年 3 月 1 日开源,到 26.10.9:Jalium UI 半年时间到底走了多远?
c语言·c++
鱼子星_7 小时前
【C++】继承和多态(上)
c++·笔记
郝学胜-神的一滴8 小时前
Qt 高级编程 045:坐标体系深度实战
开发语言·c++·windows·python·qt·程序人生
码匠许师傅8 小时前
【设计模式精讲】22.中介者模式(Mediator)
c++·设计模式·软件工程·uml·中介者模式
爱吃巧克力的程序媛11 小时前
main.cpp注册 C++ 类到 QML 元对象系统
c++·qt
YYYing.11 小时前
【C++进阶系列 (二)】关于线程堆栈的那些事——函数调用过程
开发语言·c++·函数·线程堆栈
键盘会跳舞12 小时前
【C++多线程】死锁诊断工具实战:从 Windows 到 Linux 的全链路排查
linux·c++·windows·死锁
HugoStudio_SWAN13 小时前
洛谷 P10719 \[GESP202406 五级] 黑白格——暴力美学与图像处理的最小外接矩形
c++·图像处理·人工智能·学习·程序人生·算法·目标跟踪
jimy113 小时前
C++ 的 “移动语义”——Move Semantics
开发语言·c++
励志不掉头发的内向程序员15 小时前
【LibreCAD 2D架构】从鼠标点击到图形创建:RS_ActionDrawLine交互流程与状态机解析
开发语言·c++·qt·学习·系统架构·计算机外设·交互