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;
}
相关推荐
h_a_o777oah19 分钟前
【动态规划】区间 DP :三层循环逻辑与模板实现细节(洛谷 P1880)
c++·算法·动态规划·acm·区间dp·化环为链·石子合并
QiLinkOS31 分钟前
第三视觉理解徐玉生与他的商业活动(32)
大数据·c++·人工智能·算法·开源协议
汉克老师1 小时前
GESP2026年6月认证C++一级( 第一部分选择题(8-15))精讲
c++·continue·运算符·while·break·gesp1级·模运算
鹏易灵1 小时前
C++——7.类与对象,掌握封装、继承、多态.详解
开发语言·c++·算法
Mortalbreeze1 小时前
深入 Linux 线程机制(三):线程互斥——竞争条件与互斥锁的本质
linux·运维·服务器·c++·算法
汉克老师1 小时前
GESP2026年6月认证C++一级( 第一部分选择题(1-7))精讲
c++·运算符·表达式·赋值·gesp1级·输入与输出·单循环
ALex_zry1 小时前
C++26 Freestanding 库扩展详解:无操作系统也能用标准库
java·jvm·c++
码上有光2 小时前
c++:map和set的底层实现
android·java·c++·set·map
zh_xuan2 小时前
c++ std::Any 用法
开发语言·c++·any
QiLinkOS11 小时前
第三视觉理解徐玉生与他的商业活动(30)
大数据·c++·人工智能·算法·开源协议