ostream_iterator 与每个回路效率
ostream_iterator vs for each loop efficiency
我昨天看到这个用户发帖。我认为这是一种很酷的输出向量的方式。所以我输入了一个示例,并问自己这与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
(例如 41856 vs 11207 和 55198 vs 10308 纳秒(。有时字符串ostream_iterator
会跳出for each
循环,而for each
循环和ostream_iterator
几乎与整数保持并驾齐驱。
这是为什么呢?ostream_iterator
的幕后发生了什么?在效率和速度方面,我什么时候会在for each
循环中使用ostream_iterator
?
小心微观基准。
关于此代码,我有几个一般性评论:
- 将只读变量作为常量引用传递,而不是作为常规引用传递。但这不会影响性能
- 不要使用 std::endl,因为它调用 flush((,最终会在这样的微基准测试中占用大部分运行时间。例如,使用 std::endl 打印双精度需要 37010 ns,而使用""打印双精度需要 4456 ns 。
- 单次测量是不准确的。为了消除任何测量噪声,您必须在一个循环中多次运行它。这仍然不完美,因为最好的办法是互换运行测试(制作随机事件,这可能会减慢代码速度,以相同的方式影响两个实现(
- 最好将其重定向到文件,否则终端速度将主导结果。
以下是更正后的基准:
constexpr unsigned ITERATIONS = 1000000;
template <typename T>
void printVectorO(const std::vector<T> &v)
{
std::cout << "Ostream_iterator contentsn";
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 secondsnn";
}
template <typename T>
void printVectorC(const std::vector<T> &v)
{
std::cout << "For Each Loop contentsn";
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 secondsnn";
}
并调用它:
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);
}
现在,在为纳米而苦恼之后,我们有:
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版本更快。但是再次运行它会产生略有不同的结果。
相关文章:
- 为什么当我解模块化时,这个C++代代码"效率较低"?
- 代码的效率. 转到和函数调用
- 对于循环C++可能效率低下
- 内存效率表示最短路径的方法?
- 如何提高该函数的运行效率?
- 效率:标准::数组与标准::矢量
- 如何提高BST的搜索操作效率?
- Cython通过浮点数的最快方式,用于高频控制回路
- 字符串引用参数的效率C++
- 提高基于组件的游戏引擎的效率
- 在 c++ 中使用带有映射的插入效率
- 关于效率的问题
- 在SQLITE数据库中写入记录需要花费大量时间.如何提高刀片操作效率?
- 寻求提高Microsoft密封库计算效率的方法
- 做对了一个类似竞争的问题,但需要帮助来提高效率
- C++ - 与 Numpy 中的矢量版本相比,Argsort 效率低的矢量版本实现
- C++,在对象内分配多个数据时,堆栈分配是否更有效? 在下面的程序中,类A_Heap的效率会更低吗?
- visual C++|循环效率
- 我创建了一个库,想知道设计是否效率低下
- ostream_iterator 与每个回路效率