0

大多数现代 ISA 中的 Big-O 是什么?是否有某种优化或者是天真的O(分子/分母)?我正在编写严重依赖模数运算的代码。

例如,执行 10/5 和 20/5 和 40/5 所需的相对时间是多少?Intel、nVidia、Qualcomm 等的现代处理器是否具有相同的 Big-O 分区?

注意:假设除法是 O(分子的大小),我在这里可能是错的,这个问题可能根本没有任何意义。如果是这样,请纠正我。

4

3 回答 3

2

这个问题不太好。但这也不是那么“愚蠢”,所以我尝试回答/澄清一些观点:

几乎所有现代 CPU/GPU 都有除法指令。由于它适用于默认字长,所以不管它有多快,就 Big-O 而言它是恒定的,所以它总是 O(1)。即使对于没有除法指令的嵌入式处理器、微控制器和类似物,这也是正确的,因为它是在软件中模拟的,并且软件模拟受字大小的限制,因此执行除法指令的时间总是恒定的操作(这意味着它也是 O(1))。

例外是在谈到对非字长数据执行的操作时。例如,在谈论 BigInt 库时会发生这种情况。但在这种情况下,所有操作(加法、乘法等)不再是 O(1),而是取决于数字的大小。

但请注意:Big-O 并没有说明实际计算时间。它只是忽略常数因素的渐近行为。这意味着,即使您有两种采用 O(n) 的算法,时间差也可能是 1000 倍(或一百万或任何您想要的)。除法的最佳示例:例如,加法都是 O(1),但通常除法比加法需要更多的周期/时间来执行。

于 2013-01-18T09:35:00.223 回答
0

尽管您可以使用二进制除法创建自己的实现; https://www.youtube.com/watch?v=TPVFYoxna98

根据上一篇文章,我认为大多数处理器优化实际上会快得多。您需要查看您创建的字节码才能确定,但​​这可能涉及将内容放入处理器缓存中,因此您坚持将其作为最佳解决方案;

整数 a = ... 整数 b = ...

整数商 = a / b; int 余数 = a - (商 * b);

即 a=5, b=2 商:2 余数:1

从这里开始(虽然它有错误:)-); Java - 在同一步骤中获得商和余数?

于 2022-02-16T22:11:25.417 回答
0

但是,如果您使用 2 的基数并且您知道它,您可以使用它进行优化;

public class Foo {
  public static void println(String s) {
    System.out.println(s);
  }
  
  public static void main(String [] args) {
    int size = 100;
    int[] randoms = new int[size];
    for (int i = 0; i < randoms.length; i++) {
      randoms[i] = (int) (Math.random() * 1000);
    }
    
    for (int i = 0; i < randoms.length; i++) {
      int j = randoms[i];
      int k = j >> 3;
      int l = j - (k << 3);
      println("value " + i + " " + j );
      println(" " + j + " / 8 =  " + k + " remainder " + l );
    }
    //println("hey got " + c + " from " + a + " >> " + b);
    
  }
}
于 2022-02-17T00:10:39.213 回答