我有一个Java方法,它在一个非常紧凑的循环中重复计算以下表达式,并且重复次数很多:

Math.abs(a - b) - Math.abs(c - d)

a,b,c和d是可以跨越其整个范围的长值.它们在每个循环迭代中是不同的,并且它们不满足我所知的任何不变量.

分析器指示在此方法中花费了大部分处理器时间.虽然我将首先寻求其他优化途径,但我想知道是否有更聪明的方法来计算上述表达式.

除了手动内联Math.abs()调用以获得非常小的(如果有的话)性能增益之外,还有什么数学技巧可以用来加速对这个表达式的评估吗?

解决方法:

我怀疑分析器没有给你一个真实的结果,因为它试图分析(并因此添加头部)这样一个简单的“方法”.如果没有配置文件Math.abs可以转换为少量的机器代码指令,你将无法使它更快.

我建议你做一个微基准来证实这一点.我希望加载数据要贵一个数量级.

long a = 10, b = 6, c = -2, d = 3;

int runs = 1000 * 1000 * 1000;

long start = System.nanoTime();

for (int i = 0; i < runs; i += 2) {

long r = Math.abs(i - a) - Math.abs(c - i);

long r2 = Math.abs(i - b) - Math.abs(d - i);

if (r + r2 < Integer.MIN_VALUE) throw new AssertionError();

}

long time = System.nanoTime() - start;

System.out.printf("Took an average of %.1f ns per abs-abs. %n", (double) time / runs);

版画

Took an average of 0.9 ns per abs-abs.

标签:java,optimization,algorithm

来源: https://codeday.me/bug/20190610/1208667.html

java中的math.abs_java – Math.abs(a – b)的更快实现 – Math.abs(c – d)?相关推荐

  1. java 调用wget_通过命令行执行WGET下载会更快,而通过Java代码执行时会更慢

    我正在使用WGET通过java代码下载文件,这需要大约10分钟才能下载20 MB文件.但是通过命令行执行wget下载,同样的文件以10MbPs的速度在7秒内下载.有人知道为什么吗?我该如何改进我的Ja ...

  2. mysql 分表索引_mysql中,分表查询和索引查询哪个更快?

    谢谢邀请! 查询快慢主决的因素有很多,存储碎片.数据量大属于I/O类问题:表结构设计.查询语句属于技术是否熟练(经验)问题.对于你的分表快还是索引快的这个问题本身就是有问题的: 在建立数据表的时候,索 ...

  3. java中的starts_Java Math类静态double nextAfter(double starts,double direction)示例

    java中的starts 数学类静态double nextAfter(双向启动,双向) (Math Class static double nextAfter(double starts , doub ...

  4. java中api是什么_java中API总结

    1.什么是API? 可以理解为Java自己提供的标准类库,开发人员可直接使用其方法, 而不用进行源码实现.如常用的打印方法:System.out.println();,这是Java自己提供的东西. 官 ...

  5. java中的取模_Java 中的取模和取余

    期末复习密码学时需要用到取模运算,发现 Java 中的 % 运算符并不是取模运算(Modulo Operation),而是取余运算(Complementation). 计算方法 对于整数 a,b 来说 ...

  6. Java中Random详解

    目录 伪随机 什么是伪随机数? Java随机数产生原理: Java中常见生成随机数的几种方式 Math.random() Random Random的两种构造方法: 种子的作用数什么? 小结 Thre ...

  7. java的define,关于预处理器:Java中的#define

    我开始用Java编程,我想知道是否相当于C++ EDCOX1(0)的存在. 对谷歌的快速搜索表明它没有,但有人能告诉我是否存在类似的东西吗?在Java中?我正在努力使我的代码更可读. 例如,我希望能够 ...

  8. java 中的堆和栈

    Java把内存划分成两种:一种是栈内存,一种是堆内存.          在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配. 当在一段代码块定义一个变量时,Java就在栈中为这个 ...

  9. java中正则表达式,编译报错:Invalid escape sequence (valid ones are \b \t \n \f \r \ \' \\ )...

    转自:https://www.cnblogs.com/EasonJim/p/6561666.html 若出现:Invalid escape sequence (valid ones are  \b   ...

最新文章

  1. CMD 一条命令 执行 多条命令
  2. x window的奥秘
  3. JZ2440驱动开发之环境搭建
  4. 火爆 GitHub 的《机器学习 100 天》,有人把它翻译成了中文版!
  5. ITK:无写访问权限下遍历具有邻域的图像区域
  6. 《ArcGIS Runtime SDK for Android开发笔记》——(5)、基于Android Studio构建ArcGIS Android开发环境(离线部署)...
  7. 网络运维在经济危机中茁壮成长
  8. 80%程序员不知道的职场秘诀,升职加薪不是梦
  9. smtplib python_python模块:smtplib模块
  10. 微信小程序云数据库调用模板
  11. atom n270 cpu linux,英特尔Atom Z530和Intel Pentium-M 733 那个处理能力强_intel atom z530
  12. SQLite3 学习3
  13. 适合练习听力的英文电影推荐
  14. 字节跳动最常问的前端面试题:Node.js 基础
  15. 关于C++ delete 来释放new分配的内存
  16. 长短期记忆网络(LSTM)简述
  17. XGBoost:参数解释
  18. 1001 害死人不偿命的(3n+1)猜想
  19. 面向开发人员的代码安全指南
  20. 【沃顿商学院学习笔记】管理学——07腐败控制理论The Control Theories of Corruption

热门文章

  1. luogu p4995 跳跳
  2. python基本语法(1)
  3. NMOS管与PMOS管的区别与总结
  4. Mac下安装多个版本的JDK并随意切换
  5. 刚到马来西亚旅游怎么临时解决电话卡问题
  6. 使用Bootstrap做轮播图
  7. CA认证简单介绍和工作流程
  8. Sa函数 与 sinc函数
  9. 实战一:爬取拉勾网职位信息
  10. G711 G729音频编码总结