For循环耗时从3.2秒降到0.3秒

一道面试题 1 2 3 4 5 6 7 8 9 int test(int n) { int fact = 1, num = n+1; for(int i =1; i<num; i++) { fact *= 1; } return fact; } 面试官:这段求阶乘的代码怎么样? 答:挺简洁的,简单易懂。不过如果参数 n 值比较大的话,会导致 fact 溢出,结果是错的。 面试官:嗯,是的。不过,咱们先不考虑溢出的问题,你觉得这段代码的性能怎么样? 答:时间复杂度是 O(n),而且代码比较精炼,性能应该还挺不错的吧?(心虚 ing…) 面试官:你能想办法把它优化一下,让性能更好吗? 思考 ing… 答:在多 CPU 系统上,如果 n 的值比较大的话,可以考虑用多线程来实现。 面试官:嗯,这是一个思路。如果是单 CPU 呢? 再次思考 ing… 答:用 GCC 编译的话,可以加上优化选项-O3,应该能提高性能。 面试官:嗯,还有吗? 答:没了。 面试官:好了,感谢来参加面试,回去等通知吧! 思考一下,如果是你的话,会怎么回答呢? 下面,来深入讲解一下,隐藏在这道题背后的深层次知识! 本文较长,且涉及到 CPU 内部很底层的知识,请耐心看完,一定会有收获! ...

2023-12-26 10:09 · 12 min · 5939 words · Reid