更快,更少的内存如果
Faster, less memory if?
我想知道什么更快,使用更少的内存,我会假设它是这个块,但它们可能是相同的:
if((X[i] == 0 && Y[i] == 0) ||
(X[i] == 1 && Y[i] == 1) ||
(X[i] == 0 && Y[i] == 2) ||
(X[i] == -1 && Y[i] == 3) ||
(X[i] == -2 && Y[i] == 2) ||
(X[i] == -3 && Y[i] == 1) ||
(X[i] == -4 && Y[i] == 0)) cout << "DA";
或者也许是这个块:
if(X[i] == 0 && Y[i] == 0) cout << "DA";
else if(X[i] == 1 && Y[i] == 1) cout << "DA";
else if(X[i] == 0 && Y[i] == 2) cout << "DA";
else if(X[i] == -1 && Y[i] == 3) cout << "DA";
else if(X[i] == -2 && Y[i] == 2) cout << "DA";
else if(X[i] == -3 && Y[i] == 1) cout << "DA";
else if(X[i] == -4 && Y[i] == 0) cout << "DA";
还是有更快的方法?谢谢。
如果你的编译器有任何价值,两者都会导致完全相同的编译代码。
也许例外,如果您禁用所有优化,这种情况根本不需要优化。
因此,请使用更清晰的代码,如果有疑问,则使用较短的代码:
使用第一个变体。
如果要优化,请考虑计算X[i]
,如果它们很昂贵(不太可能),则仅Y[i]
一次。
此外,您可以根据可能性进行排序(尽管如果测试足够少,也可能不值得)。
您还可以尝试将短路运算符更改为非短路,以避免跳跃(这可能会适得其反)。
顺便说一句,在这种情况插入可能会将条件测试降级为性能方面的微不足道。
首先我要说的是,您在这里无法执行的任何操作都可能对速度或内存使用量产生任何明显的差异。一个简单的事实是,导致写入cout
的逻辑所花费的时间将完全消失在噪声中。写入cout
本身的大部分时间都是如此之大,并且(至少通常)变化如此之大,以至于其余逻辑的时间是 100% 无关紧要的。
也就是说,您几乎可以肯定地将其余的逻辑减少一点。x[i] == 0 && y[i] == 0 的第一次检查可以减少到 x[i] | y[i] == 0
个。看起来其余的可以减少到unsigned(x[i])+4u < 5u && x[i] + y[i] == 2
.
这将 6 个条件减少到 3 个条件 + 一点点数学。如果这是在没有任何I/O的紧密循环中,我希望它明显更快(但结果是对流的写入,您甚至可能无法可靠地测量差异,更不用说注意到差异了)。
就个人而言,为了清晰和很少重复,我会选择第一个。
还要利用捷径:将最有可能的情况放在首位。
如果 X 和 Y 是具有昂贵的重载 []
运算符的类的实例,则预先计算 X[i]
并Y[i]
。请注意,对于三元类型,[]
与变量访问一样便宜。如果 X 和 Y 是模板的实例,则始终预先计算,以防万一[]
对于特定类型来说成本高昂。
- 如果 const 不分配内存,为什么我可以获取 const 的地址?
- 为什么 bool 和 _Bool 如果它们在内存中占用 1 个字节,它们只能存储 0 或 1
- 如果不分配内存,我如何能够为变量创建和分配值?
- 如果我在 c++ 中以 new 的放置形式使用没有足够的内存,会发生什么情况?
- 如果一个变量在它之前释放了另一个(相同的数据类型)变量,如何将其分配给内存?
- 如果不初始化结构中的向量,它会自动为空还是具有随机内存位置的值?
- 未找到匹配的运算符删除;如果初始化引发异常,内存将不会被释放
- 如果 RMW 操作没有任何变化,是否可以针对所有内存顺序对其进行优化
- 如果您为类的一个对象动态分配内存作为参数,会发生什么
- 内存浪费?如果main()应该只返回0或1,那么为什么main是用int而不是短int甚至char声明的
- 如果我提前将参数声明为变量而不是将它们内联写入函数调用,那有什么区别(在内存方面)?
- 在不放置新运算符的情况下,在预分配的内存上使用虚函数初始化对象 - 这可能吗?如果没有,为什么
- 如果引用应该保留,不删除析构函数中的指针会导致内存泄漏吗?
- 初始化原子指针是原子的吗?如果初始化或内存分配引发,会发生什么情况?
- 如果操作系统未清除内存泄漏,则在程序完成后内存泄漏是否仍然存在?
- 如果没有指针,如何识别堆栈上的内存?
- 如果我不将预先编写的字符串保存到变量,它还在内存中吗?
- 如果访问对象,则指向的对象内部的指针会更改内存位置
- 如果关闭娱乐后()所有内存都会被交易,则如何打印输出
- 更快,更少的内存如果