这是一位高级经理提出的面试问题.
哪个更快?
while(1) {
// Some code
}
Run Code Online (Sandbox Code Playgroud)
要么
while(2) {
//Some code
}
Run Code Online (Sandbox Code Playgroud)
我说两者都有相同的执行速度,因为里面的表达式while应该最终评估为true或false.在这种情况下,两者都评估,true并且条件内没有额外的条件指令while.因此,两者都具有相同的执行速度,而我更喜欢(1).
但采访者自信地说:"检查你的基础知识.while(1)比快while(2)." (他没有测试我的信心)
这是真的?
我使用C++ 11中支持的模板元编程技术在编译时(constexpr)问题中编写了Fibonacci数计算程序.这样做的目的是计算模板元编程方法和旧的传统方法之间的运行时间差异.
// Template Metaprograming Approach
template<int N>
constexpr int fibonacci() {return fibonacci<N-1>() + fibonacci<N-2>(); }
template<>
constexpr int fibonacci<1>() { return 1; }
template<>
constexpr int fibonacci<0>() { return 0; }
// Conventional Approach
int fibonacci(int N) {
if ( N == 0 ) return 0;
else if ( N == 1 ) return 1;
else
return (fibonacci(N-1) + fibonacci(N-2));
}
Run Code Online (Sandbox Code Playgroud)
我在GNU/Linux系统上运行N = 40的两个程序并测量时间,发现传统解决方案(1.15秒)比基于模板的解决方案(0.55秒)慢两倍左右.这是一个重大改进,因为这两种方法都基于递归.
为了更好地理解它,我用g ++ 编译了程序(-fdump-tree-all标志),发现编译器实际上生成了40个不同的函数(如fibonacci <40>,fibonacci <39> ... fibonacci <0>).
constexpr int fibonacci() …Run Code Online (Sandbox Code Playgroud) 我正在使用C++ constexpr在编译时评估此代码可以正确评估的计算的Fibonacci序列的最大项.为此,我使用以下代码:
constexpr unsigned long long fibo(unsigned n) {
return (n < 2) ? 1 : fibo(n-1)+fibo(n-2);
}
constexpr unsigned max_fibo(unsigned n) {
return (fibo(n+1) >= fibo(n)) ? max_fibo(n+1) : n;
}
const unsigned MAX_FIBO_TERM = max_fibo(0);
Run Code Online (Sandbox Code Playgroud)
这很好,并快速构造MAX_FIBO_TERM(我的机器上的92)正确的值.但是,使用该fibo函数在运行时实际计算项是非常慢的(仅计算前48个项需要大约90秒).
我可以使用替代函数来计算更快的术语:
unsigned long long fiboiter(unsigned n, unsigned long long &prev,
unsigned long long &prevprev) {
return prev = (n < 2) ? prevprev = 1 :
(std::swap(prev, prevprev), prev + prevprev);
}
Run Code Online (Sandbox Code Playgroud)
但是,我似乎无法将其变为有效的constexpr功能.(这就是为什么它以那种奇怪的方式写的.)当我运行这个版本时,我的机器需要0.005秒.
当我用g++ …
c++ ×2
c++11 ×2
fibonacci ×2
c ×1
constexpr ×1
performance ×1
recursion ×1
templates ×1
while-loop ×1