线性搜索通过vector [i] yealds 0ms响应而vector.at(i)yealds时间

时间:2016-08-26 13:11:27

标签: c++ vector

我必须补充一点:我称我的线性搜索为15 000次,而我所查看的最低范围是每次迭代最多50 000次。因此意味着在第一次迭代中有15 000 * 50 000个查找。这应该超过0毫秒。

我有这个基本的线性搜索:

bool linearSearch(std::vector<int>&primes, int number, int range) {

    for (int i = 0; i < range; i++) {
        if (primes[i] == number)
            return true;
    }
    return false;
}

我花时间使用:

void timeLinearSearch(std::vector<int>& primes) {
    clock_t start, stop;
    size_t NRND = 15000;    //  15000 primes per clock

    for (int N = 50000; N <= 500000; N += 50000)    // increase by 50k each iteration
    {
        for (int repeat = 0; repeat < 5; repeat++) {
            start = clock();
            for (int j = 0; j < NRND; j++) {
                linearSearch(primes, rand(), N);
            }
            stop = clock();
            std::cout << stop - start << ", " << N << std::endl;
        }

    }
}

这里的问题是所花费的时间是0ms。向量&#39;素数&#39;其中大约有600,000个元素,因此搜索范围内。

在线性搜索中,如果我改变:

if(primes[i] == number)

为:

if(primes.at(i) == number)

然后我得到时间&gt; 0用于搜索。

我将我的线性搜索与primes.at(i)与std :: find()进行了比较:

for (int j = 0; j < NRND; j++) {
    std::find(primes.begin(), primes.begin() + N, rand());
}

这比我的.at()找到的速度快大约200ms。

为什么我的搜索使用std :: vector [i]给我0ms的时间?

3 个答案:

答案 0 :(得分:8)

当编译器可以看到linearSearch的实现时,它可以在您使用operator[]时完全优化它,因为没有副作用。这就是你看零时间的原因。

另一方面,

at(..)有副作用(当索引超出范围时抛出),因此编译器无法优化它。

您可以修复您的基准,以确保保持呼叫到位,例如,通过计算匹配数量:

int count = 0;
for (int j = 0; j < NRND; j++) {
    count += linearSearch(primes, rand(), N);
}
std::cout << stop - start << ", " << N << " " << count << std::endl;

答案 1 :(得分:3)

你需要小心编写这样的比较代码;确保您拥有统计上非常严格的数据解释方式。假设你有这个,这里有一个解释:

lines: {xDomain[firstVal, lastVal]}无需检查[i]是否在向量的范围内,而i 必须检查。

这解释了速度的差异:您的编译器能够为at(i)生成更快的代码。

答案 2 :(得分:0)

我觉得你比较苹果和橘子。 你要求找到&#34; rand()&#34;元素因此在每次运行中都是不同的数字

如何寻找这样的元素(假设你有N个素数): 素数[N / 10],素数[N / 2],素数(3 * N / 4),......对于要找到的元素 (如果您希望找不到项目,请添加+1)

小心,如果你的素数数组按递增顺序排序,如果primes [i]&gt;你可能想要返回false。数字而不是通过整个数组(甚至做二分搜索),除非你只是看.at()评估