我看到了这个用户post yesterday。我认为这是输出矢量的一种很酷的方式。所以我输入了一个示例,并问自己这与for each
循环相比如何?
template <typename T>
void printVectorO(std::vector<T> &v)
{
std::cout << "Ostream_iterator contents: " << std::endl;
auto start = std::chrono::high_resolution_clock::now();
std::ostream_iterator<T> ost(std::cout, " ");
std::copy(begin(v), end(v), ost);
std::cout << std::endl;
auto end = std::chrono::high_resolution_clock::now();
auto time = end - start;
auto nano = std::chrono::duration_cast<std::chrono::nanoseconds>(time);
std::cout << "Ostream_iterator computation took: " << nano.count() << " nano seconds"<< std::endl;
std::cout << std::endl;
}
template <typename T>
void printVectorC(std::vector<T> &v)
{
std::cout << "For Each Loop contents: " << std::endl;
auto start = std::chrono::high_resolution_clock::now();
for (auto && e : v) std::cout << e << " ";
std::cout << std::endl;
auto end = std::chrono::high_resolution_clock::now();
auto time = end - start;
auto nano = std::chrono::duration_cast<std::chrono::nanoseconds>(time);
std::cout << "For Each Loop took: " << nano.count() << " nano seconds" << std::endl;
std::cout << std::endl;
}
我使用了3个向量来测试它:
std::vector<double> doubles = { 3.15, 2.17, 2.555, 2.014 };
std::vector<std::string> strings = { "Hi", "how", "are", "you" };
std::vector<int> ints = { 3, 2 , 2 , 2 };
我得到了各种结果。当我输出双打时,for each
循环总是胜过ostream_iterator
(ex 41856 vs 11207和55198 vs 10308 nanose)。有时,字符串ostream_iterator
击败for each
循环,而for each
循环和ostream_iterator
几乎与整数保持一致。
这是为什么? ostream_iterator
的幕后发生了什么?在效率和速度方面,我何时会在ostream_iterator
循环上使用for each
?
答案 0 :(得分:3)
提防微基准测试。
关于此代码,我有几点一般评论:
这是更正的基准:
constexpr unsigned ITERATIONS = 1000000;
template <typename T>
void printVectorO(const std::vector<T> &v)
{
std::cout << "Ostream_iterator contents\n";
auto start = std::chrono::high_resolution_clock::now();
for (unsigned i=0 ; i < ITERATIONS; ++i) {
std::ostream_iterator<T> ost(std::cout, " ");
std::copy(begin(v), end(v), ost);
std::cout << '\n';
}
auto end = std::chrono::high_resolution_clock::now();
auto time = end - start;
auto nano = std::chrono::duration_cast<std::chrono::nanoseconds>(time);
std::cout << "Ostream_iterator computation took: "
<< nano.count() / ITERATIONS << " nano seconds\n\n";
}
template <typename T>
void printVectorC(const std::vector<T> &v)
{
std::cout << "For Each Loop contents\n";
auto start = std::chrono::high_resolution_clock::now();
for (unsigned i=0 ; i < ITERATIONS ; ++i) {
for (auto && e : v) std::cout << e << " ";
std::cout << '\n';
}
auto end = std::chrono::high_resolution_clock::now();
auto time = end - start;
auto nano = std::chrono::duration_cast<std::chrono::nanoseconds>(time);
std::cout << "For Each Loop took: "
<< nano.count() / ITERATIONS << " nano seconds\n\n";
}
并通过以下方式调用它:
template <class Container>
void test(const Container & ctr)
{
printVectorC2(ctr);
printVectorO2(ctr);
}
int main()
{
std::vector<double> doubles = { 3.15, 2.17, 2.555, 2.014 };
test(doubles);
std::vector<std::string> strings = { "Hi", "how", "are", "you" };
test(strings);
std::vector<int> ints = { 3, 2 , 2 , 2 };
test(ints);
}
现在,在为nano进行grep之后,我们有了:
For Each Loop took: 2045 nano seconds
Ostream_iterator computation took: 2033 nano seconds
For Each Loop took: 487 nano seconds
Ostream_iterator computation took: 485 nano seconds
For Each Loop took: 503 nano seconds
Ostream_iterator computation took: 499 nano seconds
几乎没有任何区别。实际上,通过这种特定的运行,似乎认为ostream版本更快。但是再次运行会产生稍微不同的结果。