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;
}
相关推荐
阿闽ooo2 小时前
抽象工厂模式实战:用C++打造家具生产系统(附UML图与完整代码)
c++·设计模式·抽象工厂模式·uml
梁下轻语的秋缘2 小时前
用 LoRa + W5500 做一个无线呼叫器
c语言·c++
YoungHong19922 小时前
C++ 硬核基础:为什么函数重载不能只看返回值?
开发语言·c++
我不会插花弄玉2 小时前
vector【由浅入深-C++】
c++
兵哥工控2 小时前
mfc静态文本控件背景及字体颜色设置实例
c++·mfc
hqzing2 小时前
C语言程序调用syscall的几种方式
linux·c++
迟熙2 小时前
你的return,真的return对了吗?
c++
superman超哥2 小时前
仓颉内存分配优化深度解析
c语言·开发语言·c++·python·仓颉
2401_841495642 小时前
并行程序设计与实现
c++·python·算法·cuda·mpi·并行计算·openmp