大多数现代 ISA 中的 Big-O 是什么?是否有某种优化或者是天真的O(分子/分母)?我正在编写严重依赖模数运算的代码。
例如,执行 10/5 和 20/5 和 40/5 所需的相对时间是多少?Intel、nVidia、Qualcomm 等的现代处理器是否具有相同的 Big-O 分区?
注意:假设除法是 O(分子的大小),我在这里可能是错的,这个问题可能根本没有任何意义。如果是这样,请纠正我。
大多数现代 ISA 中的 Big-O 是什么?是否有某种优化或者是天真的O(分子/分母)?我正在编写严重依赖模数运算的代码。
例如,执行 10/5 和 20/5 和 40/5 所需的相对时间是多少?Intel、nVidia、Qualcomm 等的现代处理器是否具有相同的 Big-O 分区?
注意:假设除法是 O(分子的大小),我在这里可能是错的,这个问题可能根本没有任何意义。如果是这样,请纠正我。
这个问题不太好。但这也不是那么“愚蠢”,所以我尝试回答/澄清一些观点:
几乎所有现代 CPU/GPU 都有除法指令。由于它适用于默认字长,所以不管它有多快,就 Big-O 而言它是恒定的,所以它总是 O(1)。即使对于没有除法指令的嵌入式处理器、微控制器和类似物,这也是正确的,因为它是在软件中模拟的,并且软件模拟受字大小的限制,因此执行除法指令的时间总是恒定的操作(这意味着它也是 O(1))。
例外是在谈到对非字长数据执行的操作时。例如,在谈论 BigInt 库时会发生这种情况。但在这种情况下,所有操作(加法、乘法等)不再是 O(1),而是取决于数字的大小。
但请注意:Big-O 并没有说明实际计算时间。它只是忽略常数因素的渐近行为。这意味着,即使您有两种采用 O(n) 的算法,时间差也可能是 1000 倍(或一百万或任何您想要的)。除法的最佳示例:例如,加法都是 O(1),但通常除法比加法需要更多的周期/时间来执行。
尽管您可以使用二进制除法创建自己的实现; https://www.youtube.com/watch?v=TPVFYoxna98
根据上一篇文章,我认为大多数处理器优化实际上会快得多。您需要查看您创建的字节码才能确定,但这可能涉及将内容放入处理器缓存中,因此您坚持将其作为最佳解决方案;
整数 a = ... 整数 b = ...
整数商 = a / b; int 余数 = a - (商 * b);
即 a=5, b=2 商:2 余数:1
从这里开始(虽然它有错误:)-); Java - 在同一步骤中获得商和余数?
但是,如果您使用 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);
}
}