基于较小的修改,运行时的差异很小

时间:2019-07-03 03:36:25

标签: c++ optimization micro-optimization

这是一个leetcode问题。我不知道为什么,但是使用quickselect方法在这两个稍有不同的find-Kth-element版本之间得到了20ms的一致差异。

第一个,时间为64毫秒。

int findKthLargest(vector<int>& nums, int k) {
    int f = 0;
    int l = nums.size()-1;

    k--; // convert to index
    int fi = f;
    while(f <= l) {
        int pivot = nums[l];
        fi = f;
        for(int li = f; li < l; li++) {
            if(nums[li] > pivot) {
                swap(nums[fi], nums[li]); // *** first version
                fi++;
            }
        }
        swap(nums[fi], nums[l]); 

        if(k < fi) { l = fi-1; }
        else if(k > fi) { f = fi+1; }
        else { return nums[fi]; }
    }

    return -1;
}

第二个,耗时84ms。

int findKthLargest(vector<int>& nums, int k) {
    int f = 0;
    int l = nums.size()-1;

    k--; // convert to index
    int fi = f;
    while(f <= l) {
        int pivot = nums[l];
        fi = f;
        for(int li = f; li < l; li++) {
            if(nums[li] > pivot) {
                swap(nums[fi++], nums[li]); // *** The only change, combining the two lines together
            }
        }
        swap(nums[fi], nums[l]); 

        if(k < fi) { l = fi-1; }
        else if(k > fi) { f = fi+1; }
        else { return nums[fi]; }
    }

    return -1;
}

我知道这很小,但是无论一天几小时等等,多次运行后它都是一致的。我很好奇。是某些指令集依赖性还是编译器问题...?


更新

以上时间是Leetcode的结果...我找不到有关如何编译和运行代码的任何信息。可能是带有专用编译器的虚拟环境。

这可能是交换的模板问题-当我创建自己的交换函数并使用它代替std :: swap时,没有任何差异。

我使用g ++和clang在我的cpu上尝试了此操作,并且在给定完全相同的输入的情况下,无法重现函数之间的任何差异。因此,我认为这个问题没有任何价值。这只是一件奇怪的Leetcode东西。

0 个答案:

没有答案