矢量模板的编译速度是否比push_back快
Does vector emplace compile faster than push_back?
虽然emplace
具有运行时优势,但这个答案表明它也可以加快编译速度。这个家伙同意。
为什么?
由于在运行时和编译期间要比较emplace
、push_back
和construction
,因此这里有很多问题。让我们先进行汇编。
编译包括将源代码翻译成汇编指令。在发出任何汇编指令之前,通常有两个阶段:词法分析和解析。词法分析是检查语法,解析是检查和处理语义(同样,这是非常简化的)。
给定两种陈述:
my_vector.push_back(value);
my_vector.emplace(value);
扫描、解析和评估所需的工作应该几乎相同。因此,汇编时间不应该有任何差异。
此外,以大多数编译器的处理速度,如果编译时间存在差异,则与启动编译器和执行I/O的时间相比,这一差异可以忽略不计。充其量,我希望能节省一毫秒。如果你有1000多个这样的,你可以节省一秒钟的编译时间。人类对编译器完成的反应时间超过1秒。因此,节省下来的钱仍然微不足道或不值得。
就运行时而言,您必须对其进行概要分析。例如,假设emplace
比push_back
快1ms。您需要执行1000多个emplace
函数才能获得1秒的时间(如果您的程序持续运行且未中断)。您需要执行60000多次才能节省一分钟时间。等待I/O或其他任务完成可能会丢失所有这些节省。更有可能的是,您将节省纳秒,而不是毫秒。
将精力集中在正确和健壮的代码上。只需在程序正确、无故障且不会崩溃后才考虑优化。只有当用户说它速度慢、不能满足关键时间事件或不适合内存时才进行优化。想想在考虑这种微优化的时候,你可以写多少代码。
相关文章:
- 推导 std::vector::back() 的返回类型
- vector.back() 和 vector[vector.size() - 1] 之间的区别?
- vector.push_back(vector.back()+1) 是未定义的行为吗?
- C++自己的对象堆栈.在 push() 上复制了什么?
- C++ push() 和 pop() 方法使用指针的动态 LinkedList 的问题
- 如何像在javascript中一样"push" c ++映射
- 线路抑制状态错误 C4703 可能未初始化的局部指针变量"back"已使用
- std::vector using back(), pop_back(), push_back(), 得到'double free or corruption'错误
- vector.back()和vector.end()有什么区别
- 列表大小为 1,但 front() 和 back() 不相等
- 返回C++中没有 back() 方法的容器的最后一个元素?
- 在非空 std::list 上使用 std::list.back<int>() 时"Segmentation Fault"
- 模板堆栈类的复制构造函数中的 pop() 和 push() 不起作用
- 我们可以使用Back() - 值索引在其上执行向量插入
- 当我运行以下代码添加str.front() str.back时,它给了我200个,但为什么
- push(ing)back在循环中对象指针
- 在 C++ 中将元素添加到空向量:为什么 push.back 有效而 [] 无效
- 我似乎无法让 v.push.back() 处理字符串
- String::push_back() does not push back
- 向量resize(), push.back(), reserve()方法