C++ 基于范围的 For 循环效率
C++ Ranged-based For Loop Efficiency
当我第一次开始学习 Java 时,我记得我在想我是多么想在 C++ 中使用 for-each 循环;但是,既然已经添加了它们并且我比以前(略微)聪明了,我不得不怀疑它们是否真的更有效率?
有两种情况我很好奇,第一种是传统的数组,第二种是动态大小的对象,比如std::vector.
我预计使用 for 循环迭代传统的固定大小数组会更高效,而使用基于范围的循环动态分配的存储会更快。
int fvalues[NUMBER];
for(unsigned int x = 0; x < NUMBER; ++x) {
//Do Stuff
}
for(auto&& i : fvalues) {
//Do Stuff
}
std::vector<int> dvalues = std::vector<int>(NUMBER);
for(unsigned int x = 0; x < NUMBER; ++x) {
//Do Stuff (not adding or removing from vector)
}
for(auto&& i : dvalues) {
//Do Stuff (not adding or removing from vector)
}
任何差异最多可以忽略不计。使用以下代码:
#include <cstdint>
#include <cstddef>
#include <ctime>
#include <iostream>
#include <vector>
const size_t NUMBER = 1000000;
int main() {
time_t start;
time_t finish;
int fvalues[NUMBER];
time(&start);
for(unsigned int x = 0; x < NUMBER; ++x) {
fvalues[x] = 3;
}
time(&finish);
std::cout << "Fixed For: " << std::difftime(finish, start) << '\n';
time(&start);
for(auto&& i : fvalues) {
i = 5;
}
time(&finish);
std::cout << "Fixed Range: " << std::difftime(finish, start) << '\n';
std::vector<int> dvalues;
for(unsigned int x = 0; x < NUMBER; ++x) {
dvalues.push_back(0);
}
time(&start);
for(unsigned int x = 0; x < NUMBER; ++x) {
dvalues[x] = 3;
}
time(&finish);
std::cout << "Dynamic For: " << std::difftime(finish, start) << '\n';
time(&start);
for(auto&& i : dvalues) {
i = 5;
}
time(&finish);
std::cout << "Dynamic Range: " << std::difftime(finish, start) << '\n';
}
所有测试的结果始终为 0。并且对整个程序进行计时(终端时间命令)会产生 0.033 秒的用户时间,因此结果并不令人惊讶。
当我第一次开始学习 Java 时,我记得我在想我是多么想在 C++ 中使用 for-each 循环;但是,既然已经添加了它们并且我比以前(略微)聪明了,我不得不怀疑它们是否真的更有效率?
有两种情况我很好奇,第一种是传统的数组,第二种是动态大小的对象,比如std::vector.
我预计使用 for 循环迭代传统的固定大小数组会更高效,而使用基于范围的循环动态分配的存储会更快。
int fvalues[NUMBER];
for(unsigned int x = 0; x < NUMBER; ++x) {
//Do Stuff
}
for(auto&& i : fvalues) {
//Do Stuff
}
std::vector<int> dvalues = std::vector<int>(NUMBER);
for(unsigned int x = 0; x < NUMBER; ++x) {
//Do Stuff (not adding or removing from vector)
}
for(auto&& i : dvalues) {
//Do Stuff (not adding or removing from vector)
}
任何差异最多可以忽略不计。使用以下代码:
#include <cstdint>
#include <cstddef>
#include <ctime>
#include <iostream>
#include <vector>
const size_t NUMBER = 1000000;
int main() {
time_t start;
time_t finish;
int fvalues[NUMBER];
time(&start);
for(unsigned int x = 0; x < NUMBER; ++x) {
fvalues[x] = 3;
}
time(&finish);
std::cout << "Fixed For: " << std::difftime(finish, start) << '\n';
time(&start);
for(auto&& i : fvalues) {
i = 5;
}
time(&finish);
std::cout << "Fixed Range: " << std::difftime(finish, start) << '\n';
std::vector<int> dvalues;
for(unsigned int x = 0; x < NUMBER; ++x) {
dvalues.push_back(0);
}
time(&start);
for(unsigned int x = 0; x < NUMBER; ++x) {
dvalues[x] = 3;
}
time(&finish);
std::cout << "Dynamic For: " << std::difftime(finish, start) << '\n';
time(&start);
for(auto&& i : dvalues) {
i = 5;
}
time(&finish);
std::cout << "Dynamic Range: " << std::difftime(finish, start) << '\n';
}
所有测试的结果始终为 0。并且对整个程序进行计时(终端时间命令)会产生 0.033 秒的用户时间,因此结果并不令人惊讶。