我必须补充一点:我称我的线性搜索为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的时间?
答案 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()评估