听说vector用指针查找会比用下标快,今天特地实践了一下
std::vector<int> int_arr = { 0, 1, 2, 3, 4, 5, 6, 7 };
int int_arr_size = int_arr.size();
int nn = 100'000;//执行次数
int i = 0;
int temp;
//下标查找
void findByIndex()
{
int n1 = nn;
while (n1--)
{
for (i = 0; i < int_arr_size; i++)
{
temp = int_arr[i];
}
}
}
//指针查找
void findByPointer()
{
int n2 = nn;
while (n2--)
{
int* i_ptr = &int_arr[0];
for (i = 0; i < int_arr_size; i++)
{
temp = *(i_ptr++);
}
}
}
int main()
{
std::chrono::steady_clock::time_point now = std::chrono::steady_clock::now();
findByIndex();
printf("index\t%f\n", std::chrono::duration_cast<std::chrono::duration<double>>(std::chrono::steady_clock::now() - now).count());
now = std::chrono::steady_clock::now();
findByPointer();
printf("pointer\t%f\n", std::chrono::duration_cast<std::chrono::duration<double>>(std::chrono::steady_clock::now() - now).count());
return 0;
}
结果如下
整整快了10倍!
还听说new int会比用vector更快,也实践了一下
int* int_arr2 = new int[8]{ 0, 1, 2, 3, 4, 5, 6, 7 };
//new int索引查找
void findByNewIndex()
{
int n1 = nn;
while (n1--)
{
for (i = 0; i < int_arr_size; i++)
{
temp = int_arr2[i];
}
}
}
//new int指针查找
void findByNewPointer()
{
int n1 = nn;
while (n1--)
{
int* i_ptr = &int_arr2[0];
for (i = 0; i < int_arr_size; i++)
{
temp = *(i_ptr++);
}
}
}
int main()
{
std::chrono::steady_clock::time_point now = std::chrono::steady_clock::now();
findByIndex();
printf("index\t%f\n", std::chrono::duration_cast<std::chrono::duration<double>>(std::chrono::steady_clock::now() - now).count());
now = std::chrono::steady_clock::now();
findByPointer();
printf("pointer\t%f\n", std::chrono::duration_cast<std::chrono::duration<double>>(std::chrono::steady_clock::now() - now).count());
now = std::chrono::steady_clock::now();
findByNewIndex();
printf("newIndex\t%f\n", std::chrono::duration_cast<std::chrono::duration<double>>(std::chrono::steady_clock::now() - now).count());
now = std::chrono::steady_clock::now();
findByNewPointer();
printf("newPointer\t%f\n", std::chrono::duration_cast<std::chrono::duration<double>>(std::chrono::steady_clock::now() - now).count());
return 0;
}
结果如下
new比vector整整快了100倍!
再测测std::iterator的速度吧
auto it = int_arr.begin();
void findByIterator()
{
int n3 = nn;
while (n3--)
{
for (it = int_arr.begin(); it != int_arr.end(); it++)
{
temp = *it;
}
}
}
int main()
{
std::chrono::steady_clock::time_point now = std::chrono::steady_clock::now();
findByIterator();
printf("iterator\t%f\n", std::chrono::duration_cast<std::chrono::duration<double>>(std::chrono::steady_clock::now() - now).count());
return 0;
}
结果如下
可见std::vector下iterator是最慢的
以上代码使用win10下vs2017 debug下编译