当前位置: 首页 > backend >正文

Sweet Snippet 之 指数函数优化

本文简述了一些关于指数函数优化的测试结论

自己平日工作中需要使用指数函数(pow)的情况不多,偶有遇到,可能也就是调用一下标准库函数了:

// return x^y
float pow_std(float x, float y)
{return std::pow(x, y);
}

后来想到在自己的使用场景中,其实指数参数(y)都仅会是正整数罢了,遂尔想到可以简单优化(特化)一下,于是有了下面的代码:

// return x^y(y is unsigned int)
float pow_uint_mul(float x, unsigned int y)
{float result = 1.0f;for (unsigned int i = 0; i < y; ++i){result *= x;}return result;
}

简单测了一下性能,确实是比标准实现快了不少,优化故事本来到此就可以结束了,没想自己还是"本能"的从遍历联想到了分治,于是又有了下面的代码:

// return x^y(y is unsigned int)
float pow_uint_recur(float x, unsigned int y)
{if (y == 0){return 1.0f;}else{const bool is_odd = ((y & 1) != 0);if (is_odd){const auto result = pow_uint_recur(x, (y - 1) / 2);return result * result * x;}else{const auto result = pow_uint_recur(x, y / 2);return result * result;}}
}

可惜上述代码虽然做了分治处理,但是递归(函数调用)成本一眼望去还是不容小觑,又简单测试了一把,果不其然,代码效率还不如遍历版本,于是最后又有了一个分治的迭代版本:

// return x^y(y is unsigned int)
float pow_uint_iter(float x, unsigned int y)
{if (y == 0){return 1.0f;}else{float result = x;unsigned int base_pow = 1;while (base_pow * 2 < y){result *= result;base_pow *= 2;}for (auto i = base_pow; i < y; ++i){result *= x;}return result;}
}

最后测试了一下,诚然,上述版本确实在效率上优于遍历版本了,但是相对的,实现上也更复杂,维护性应该也是几个版本中最差的,综合来看,除非你的使用场景特殊(譬如指数参数很大),否则我还是更推荐上面的遍历版本(pow_uint_mul) ~

http://www.xdnf.cn/news/9319.html

相关文章:

  • Spring AI 本地Ollama
  • 嵌入式Linux快速入门第1~2章
  • Selenium 测试框架 - Ruby
  • el-table设置自定义css
  • C语言数组遍历的方法(包含二维数组)
  • 如何构建一个高效的 iOS 应用日志体系?从开发调试到使用KeyMob上线排查的实践经验
  • vmvare 虚拟机内存不足
  • npm/yarn/pnpm安装时Sharp模块报错解决方法
  • 商品条形码查询接口如何用C#进行调用?
  • 001 flutter学习的注意事项及前期准备
  • leetcode hot100刷题日记——20.爬楼梯
  • Ubuntu实现和主机的复制粘贴 VMware-Tools(open-vm-tools)
  • pikachu靶场通关笔记04-暴力破解之Token绕过
  • 阿里云云网络论文:Nezha,计算网络解耦下的vSwitch池化架构
  • 大模型(6)——语义分割
  • 人工智能模型方面有哪些优化措施,可以提升模型的准确率
  • Java 反射机制深度解析:从原理到实战应用
  • TS.43规范-1
  • SAAS架构设计-1-模块说明
  • doucker 挂载卷
  • Fast-DDS Spy 工具
  • 2025CCPC河北省赛题解
  • (五)MMA(OpenTelemetry/Rabbit MQ/)
  • 图论学习笔记 4 - 仙人掌图
  • ROS云课三分钟-3D性能测试supertuxkart和游戏推荐等-国际象棋
  • 子序列相关题目总结
  • 数据结构与算法Day3:绪论第三节抽象数据类型、算法及其描述
  • 图论回溯
  • Linux基本指令篇 —— touch指令
  • SOC-ESP32S3部分:16-I2C