为什么下面的代码片段会加快代码速度

Why does the following snippet speed up the code?

本文关键字:代码 速度 片段 为什么      更新时间:2023-10-16

我正在解决LeetCode上的搜索插入位置问题。以下代码运行所有测试用例几乎需要 9 毫秒。

class Solution {
public:
    int searchInsert(vector<int>& nums, int target) {
        int lo = 0, hi = nums.size() - 1;
        while (lo <= hi) {
            int mid = lo + (hi - lo) / 2;
            if (target < nums[mid]) {
                hi = mid - 1;
            } else if (target > nums[mid]){
                lo = mid + 1;
            } else {
                return mid;
            }
        }
        return lo;
    }
};

当我查看其他人的热门答案时,我发现了一个奇怪的代码片段。当我将代码片段复制粘贴到我的答案中时,上面的相同代码只需要 4 毫秒,这比几乎 99% 的其他解决方案都要快。谁能解释一下速度?代码段如下:

#include <vector>
#include <iostream>
using namespace std;
static vector<int> nums=[](){
    std::ios::sync_with_stdio(false);
    cin.tie(NULL);
    return vector<int>{};
}();

此代码段旨在"提高性能",但需要付费。我将解释:

std::ios::sync_with_stdio(false);

这将禁用 C 和 C++ 标准流的同步。默认情况下,它们是同步的,以允许混合 C 和 C++ I/O 流(例如,cout 和 printf 可以在C++文件中写入(。

cin.tie(NULL);

这解开了cin from cout。同样,默认情况下,它们被绑定为使 cout 出现在 cin 之前(即输出在输入之前刷新(,因此您可以执行以下操作:

cout << "Number: ";
cin >> number;

当您解开它们时,您可能会在刷新输出 (cout( 之前到达输入 (cin(。

这几行有助于使代码运行得更快,但代价是前面解释的。因此,请谨慎使用。

参考资料: https://www.geeksforgeeks.org/fast-io-for-competitive-programming