【问题标题】:arithmetics vs boolean operations (in terms of performance)算术与布尔运算(在性能方面)
【发布时间】:2012-05-27 07:46:52
【问题描述】:

假设我有一个名为num的数字,如果发生某种情况A,则将数字增加1,否则将其减少。

我可以这样写代码:

if (A) ++num;
else --num;

这段代码也可以在没有任何 if-else 的情况下编写,但会涉及更多算术(只是简单的基本算术,没有指数、对数或任何需要科学计算器才能完成的事情!) 像这样的:

num = num * x + y;

问题是,第一个或第二个代码块会执行得更快吗? (这是在 Java 中,顺便说一句)。

(请不要说它没有任何区别。这只是我正在尝试做的非常“基本”的版本。但是假设有一个非常好的分析器可以测量运行时之间的差异这两个,哪个更快?)

谢谢

【问题讨论】:

  • 首先制作您的代码,然后使用分析器检查它是否具有您想要/需要的足够性能。
  • 他们根本不做同样的事情。比较他们的表现有什么意义?写入数据库或下载文件更有效吗?好吧,如果你需要下载一个文件,写入数据库的性能是无关紧要的。
  • 你能解释一下什么是x和y吗?
  • @JBNizet:我认为 OP 想说的是,对于他试图解决的特定问题,他可以通过一些旋转和其他算术计算 +/- 1,或者他可以做一个明确的if 声明。例如,if (x >= 0) x++; else x--; 等价于 x += 1 | (x >> 31)。他在问算术路线是否会更快。 (答案是,这取决于你需要做的算术、硬件乘法的速度、你的 JIT 的智能等等。)
  • @LouisWasserman:同意并同意您之前的评论。但我的观点是,如果他想让我们讨论两个类似操作的性能,我们最好知道这些类似操作是如何实现的。回答“哪个更快?这个 if/else 语句或一些未知的算术运算会导致相同的结果?”显然是不可能的。

标签: java performance logic discrete-mathematics


【解决方案1】:

这类优化没有多大意义,而且大多数时候都是邪恶的,尤其是在 Java 虚拟机中,它具有 JIT 并优化了字节码。

尽可能让代码更具可读性,不要担心这种优化...

【讨论】:

    【解决方案2】:

    答案是它取决于上下文,以及 JIT 编译器在您的平台上优化代码的能力。

    • 它可能不会对您的应用程序的性能产生明显的影响。

    • 即使是这样,我们也无法预测它会产生什么不同,因为它取决于您的平台(例如,取决于您使用的特定 JVM/版本)以及周围的代码。

    最好的建议是编写代码只是为了让优化器有最好的机会完成它的工作。然后,如果性能是一个问题,请分析您的应用程序并查看热点在哪里,并优化热点。只有在探查器说它是热点时才优化此代码

    【讨论】:

      【解决方案3】:

      分支的成本可能比算术指令高 10 倍或更多,这毫无价值。当重复使用分支的同一侧时,处理器可以将成本降低到几乎为零,但是当分支的一侧发生变化时,这可能会花费大约 100 个时钟周期。 (给定一个 ++ 或 -- 可能只是一个时钟周期,这很重要)

      【讨论】:

        猜你喜欢
        • 2016-04-12
        • 2011-04-20
        • 1970-01-01
        • 2022-11-03
        • 1970-01-01
        • 2020-08-22
        • 2016-02-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多