在删除包含指向自身在列表中位置的迭代器的节点时,vs2015 上的 stl 列表性能较差

2023-12-08

我只是存储一个节点列表,每个节点都包含一个指向其在列表中位置的迭代器。然后我对插入和删除 std 列表和 boost 列表节点所需的时间进行基准测试。

Includes

#include <iostream>
#include <memory>
#include <list>
#include <chrono>    
#include "boost/container/list.hpp"
#include "boost/shared_ptr.hpp"
#include "boost/make_shared.hpp"

#define ONE_BILLION             1000000000
#define ONE_HUNDRED_MILLION     100000000
#define TEN_MILLION             10000000
#define ONE_MILLION             1000000
#define ONE_HUNDRED_THOUSAND    100000
#define TEN_THOUSAND            10000

帮助函数打印插入或删除的平均持续时间

void print_duration(std::ostream &out, const std::string& str, const std::chrono::high_resolution_clock::duration &d)
{
    out << str << ": ";

    if (d < std::chrono::microseconds(10))
        out << std::chrono::duration_cast<std::chrono::duration<float, std::nano>>(d).count() << " nano s";
    else if (d < std::chrono::milliseconds(10))
        out << std::chrono::duration_cast<std::chrono::duration<float, std::micro>>(d).count() << " micro s";
    else if (d < std::chrono::seconds(10))
        out << std::chrono::duration_cast<std::chrono::duration<float, std::milli>>(d).count() << " milli s";
    else if (d < std::chrono::minutes(10))
        out << std::chrono::duration_cast<std::chrono::duration<float>>(d).count() << " s";

    out << std::endl;
}

STL list

struct node
{
    std::list<std::shared_ptr<node>>::iterator iter;
};

void measure_list_insert_std(std::list<std::shared_ptr<node>>& l)
{
    const size_t count = TEN_THOUSAND;
    size_t i = 0;



    auto begin = std::chrono::high_resolution_clock::now();
    for (; i < count; ++i)
    {
        std::shared_ptr<node> temp = std::make_shared<node>();
        l.push_back(temp);
        temp->iter = --l.end();
    }

    std::chrono::high_resolution_clock::duration total = std::chrono::high_resolution_clock::now() - begin;
    print_duration(std::cout, "measure_list_insert_std  ", total / i);
}

void measure_list_delete_std(std::list<std::shared_ptr<node>>& l)
{
    const size_t count = TEN_THOUSAND;
    size_t i = 0;

    auto begin = std::chrono::high_resolution_clock::now();
    for (; i < count; ++i)
    {
        //std::list<std::shared_ptr<node>>::iterator it = (l.front())->iter;
        l.erase((l.front())->iter);
        //l.pop_back();
        //std::cout << l.size() << std::endl;
    }

    std::chrono::high_resolution_clock::duration total = std::chrono::high_resolution_clock::now() - begin;
    print_duration(std::cout, "measure_list_delete_std  ", total / i);
    //std::cout << l.size() << std::endl;
}

提升列表

struct node_boost
{
    boost::container::list<boost::shared_ptr<node_boost>>::iterator iter;
};

void measure_list_insert_boost(boost::container::list<boost::shared_ptr<node_boost>>& l)
{
    const size_t count = ONE_MILLION;
    size_t i = 0;



    auto begin = std::chrono::high_resolution_clock::now();
    for (; i < count; ++i)
    {
        boost::shared_ptr<node_boost> temp = boost::make_shared<node_boost>();
        l.push_back(temp);
        temp->iter = --l.end();
    }

    std::chrono::high_resolution_clock::duration total = std::chrono::high_resolution_clock::now() - begin;
    print_duration(std::cout, "measure_list_insert_boost  ", total / i);
}

void measure_list_delete_boost(boost::container::list<boost::shared_ptr<node_boost>>& l)
{
    const size_t count = ONE_MILLION;
    size_t i = 0;

    auto begin = std::chrono::high_resolution_clock::now();
    for (; i < count; ++i)
    {
        //std::list<std::shared_ptr<node>>::iterator it = (l.front())->iter;
        l.erase((l.front())->iter);
        //l.pop_back();
        //std::cout << l.size() << std::endl;
    }

    std::chrono::high_resolution_clock::duration total = std::chrono::high_resolution_clock::now() - begin;
    print_duration(std::cout, "measure_list_delete_boost  ", total / i);
    //std::cout << l.size() << std::endl;
}

Main

int main()
{
    std::list < std::shared_ptr<node>> l;

    measure_list_insert_std(l);
    measure_list_delete_std(l);

    boost::container::list<boost::shared_ptr<node_boost>> l2;
    measure_list_insert_boost(l2);
    measure_list_delete_boost(l2);

    return 0;
}

我只是存储一个节点列表,每个节点都包含一个指向其在列表中位置的迭代器。

上述代码的输出是:

测量列表插入标准:4830 纳秒

measure_list_delete_std : 431.624 微秒

measure_list_insert_boost:4462 纳秒

measure_list_delete_boost : 4248 纳秒

如果节点不包含“迭代器”元素,则一切正常,所有输出大致相似。为什么在 VS2015 实现列表中会出现此问题?


当运行代码来测试性能时,always use 优化标志。我也有同样的问题为什么 emplace_back 比 push_back 快?,所以你不是第一个面对这个问题的人。

在 IDE 上,为了进行基准测试,您必须使用发布方式,但仍然使用(始终可靠)终端和优化标志g++例如,应该记住。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在删除包含指向自身在列表中位置的迭代器的节点时,vs2015 上的 stl 列表性能较差 的相关文章

  • 使用 Unity 在构造函数中使用属性依赖注入

    好的 我在基类中定义了一个依赖属性 我尝试在其派生类的构造函数内部使用它 但这不起作用 该属性显示为 null Unity 在使用 container Resolve 解析实例后解析依赖属性 我的另一种选择是将 IUnityContaine
  • Unix网络编程澄清

    我正在翻阅这本经典书籍Unix网络编程 https rads stackoverflow com amzn click com 0139498761 当我偶然发现这个程序时 第 6 8 节 第 179 180 页 include unp h
  • 如何检查QProcess是否正确执行?

    QProcess process sdcompare QString command sdcompare QStringList args sdcompare command sdcompare diff args sdcompare lt
  • 将 HTML 字符串加载到 UIWebView 中的延迟

    我在导航控制器中有两个视图控制器 第一个视图控制器有一个带有按钮的菜单 按下此按钮将移动到第二个视图控制器并将 html 字符串加载到 UIWebView 中 没有其他东西被加载到 webview 中 只是一个简单的 NSString 其中
  • 向 Nhibernate 发出 SQL 查询

    如何将此 SQL 查询发送给 Nhibernate SELECT Customer name FROM Company INNER JOIN Customer ON Company CompanyId Customer CompanyId
  • 将内置类型转换为向量

    我的 TcpClient 类接受vector
  • 单元测试一起运行时失败,单独运行时通过

    所以我的单元测试遇到了一些问题 我不能只是将它们复制并粘贴到这里 但我会尽力而为 问题似乎是 如果我一项一项地运行测试 一切都会按预期进行 但如果我告诉它一起运行测试 则 1 5 将通过 TestMethod public void Obj
  • 如何访问另一个窗体上的ListView控件

    当单击与 ListView 所在表单不同的表单中的按钮时 我试图填充 ListView 我在 Form1 中创建了一个方法以在 Form2 中使用 并将参数传递给 Form1 中的方法 然后填充 ListView 当我调试时 我得到了传递的
  • 生成(非常)大的非重复整数序列而不进行预洗牌

    背景 我编写了一个简单的媒体客户端 服务器 我想生成一个不明显的时间值 随从客户端到服务器的每个命令一起发送 时间戳中将包含相当多的数据 纳秒分辨率 即使它不是真正准确 因为现代操作系统中计时器采样的限制 等 我想做的 在 Linux 上
  • 如何在 C# 中定义文本框数组?

    您好 当我在 Windows 申请表上创建文本框时 我无法将其命名为 box 0 box 1 等 我这样做的目的是因为我想循环使用它们 其实我发现TextBox array firstTextBox secondTextBox 也有效
  • 使用 JNI 从 Java 代码中检索 String 值的内存泄漏

    我使用 GetStringUTFChars 从使用 JNI 的 java 代码中检索字符串的值 并使用 ReleaseStringUTFChars 释放该字符串 当代码在 JRE 1 4 上运行时 不会出现内存泄漏 但如果相同的代码在 JR
  • 未经许可更改内存值

    我有一个二维数组 当我第一次打印数组的数据时 日期打印正确 但其他时候 array last i 的数据从 i 0 到 last 1 显然是一个逻辑错误 但我不明白原因 因为我复制并粘贴了 for 语句 那么 C 更改数据吗 I use g
  • std::async 与重载函数

    可能的重复 std bind 重载解析 https stackoverflow com questions 4159487 stdbind overload resolution 考虑以下 C 示例 class A public int f
  • 有人可以提供一个使用 Amazon Web Services 的 itemsearch 的 C# 示例吗

    我正在尝试使用 Amazon Web Services 查询艺术家和标题信息并接收回专辑封面 使用 C 我找不到任何与此接近的示例 所有在线示例都已过时 并且不适用于 AWS 的较新版本 有一个开源项目CodePlex http www c
  • 如何从main方法调用业务对象类?

    我已将代码分为业务对象 访问层 如下所示 void Main Business object public class ExpenseBO public void MakeExpense ExpensePayload payload var
  • 如何对 Web Api 操作进行后调用?

    我创建了一个 Web API 操作 如下所示 HttpPost public void Load string siteName string providerName UserDetails userDetails implementat
  • Process.Start() 方法在什么情况下返回 false?

    From MSDN https msdn microsoft com en us library e8zac0ca v vs 110 aspx 返回值 true 表示有新的进程资源 开始了 如果由 FileName 成员指定的进程资源 St
  • 有没有办法强制显示工具提示?

    我有一个验证字段的方法 如果无法验证 该字段将被清除并标记为红色 我还希望在框上方弹出一个工具提示 并向用户显示该值无效的消息 有没有办法做到这一点 并且可以控制工具提示显示的时间 我怎样才能让它自己弹出而不是鼠标悬停时弹出 If the
  • memset 未填充数组

    u32 iterations 5 u32 ecx u32 malloc sizeof u32 iterations memset ecx 0xBAADF00D sizeof u32 iterations printf 8X n ecx 0
  • Java 可变 BigInteger 类

    我正在使用 BigIntegers 进行计算 该计算使用一个调用 multiply 大约 1000 亿次的循环 并且从 BigInteger 创建新对象使其非常慢 我希望有人编写或找到了 MutableBigInteger 类 我在 jav

随机推荐

  • 未找到 AWS ec2 winreg

    我正在尝试从亚马逊 EC2 大型实例运行 python 应用程序 然而 它在 scipy 中抱怨 因为它找不到名为 winreg 的东西 我不知道如何重新配置 它 所以它不再是问题 python2 app py Running on htt
  • Chrome 扩展如何在页面底部添加浮动栏?

    我正在创建一个需要注入浮动元素的 chrome 扩展 即position fixed 在页面底部 我的要求是 我需要从内容脚本访问其中的元素 这是因为我将事件附加到按钮 以便用户可以从浮动栏在当前选项卡上执行操作 我希望它的样式保持独立于当
  • 显示斯坦福 NER 置信度分数

    我使用斯坦福 NER CRFClassifier 从新闻文章中提取命名实体 为了实现主动学习 我想知道每个标记实体的类的置信度分数是多少 显示示例 地点 0 20 人员 0 10 组织 0 60 其他 0 10 这是我从文本中提取命名实体的
  • 启动 ASP.NET 表单身份验证

    我开始学习 ASP NET 表单身份验证 并且正在寻找一篇好文章来帮助我入门 我之前听说 ASP NET 表单身份验证使用大量数据库表 前面带有aspnet 但是我发现的任何例子都没有显示这一点 例如我认为有一个aspnet users t
  • 创建数据框时如何解决 scala.MatchError

    我有一个具有复杂结构行的文本文件 我正在使用客户转换器 它将给定的字符串 行 转换为 Pojo 类 countryInfo 转换后 我正在构建 DF POJO 类有一个字段 它是自定义类型列表 GlobalizedPlayTimeWindo
  • 调用unique_ptr子类继承的模板构造函数

    这不是关于模板构造函数甚至调用继承的模板构造函数的问题的重复 它具体是关于在 unique ptr 模板的类实例 的子类中调用继承的构造函数 问题 为了使代码更容易理解 我使用using在这个例子中 using B std unique p
  • 使用XSLT输出多个文件

    我正在尝试获取一个我发现的使用 XSLT 2 0 输出多个文件的示例 将 Saxon B 9 7 0 1 与 Java 1 6 一起使用时 出现以下错误 C Documents and Settings Administrator Desk
  • 以字节数组为键的ReduceByKey

    我想使用 RDD 对Tuple2
  • Tensorflow 将数据从 tfrecords 正确读取到小批量中

    我正在尝试将数据从 csv 转换为 tfrecords 然后以小批量读取它并执行一个简单的 MLP 但我遇到了一些我无法弄清楚的错误 运行时错误 尝试使用关闭的会话 其次是 TypeError 提要的值不能是 tf Tensor 对象 可接
  • Jenkins 使用 groovy 为作业添加权限

    我需要向特定用户添加一些权限 读取 构建 工作空间 取消等 到很多作业 我想知道是否有一种方法可以使用 groovy 脚本而不是手动执行此操作 我尝试了上述解决方案 他们nearly工作了 我的所有尝试都会导致当前内存中的权限反映新设置 但
  • 如何将 ORMLite 与抽象类一起使用?

    我有一个基类Peripheral 课程Sensor and Master是的扩展Peripheral 我需要 ORMlite 来实例化之前保存的 Peripheral 对象 显然任何实例化的尝试Peripheral反思将导致ClassIns
  • Pentaho Spoon - 根据字段内容输出到多个文件

    我一直在尝试根据特定字段的值将 pentaho 转换的结果拆分为多个文件 但没有任何运气 例如 包含以下内容的结果集 姓氏 名字 国家 地区 奥巴马 巴拉克 美国 卡梅伦 大卫 英国 布莱尔 托尼 英国 将导致创建 2 个输出文件 USA
  • 如何使用 HTTPS 获取网站内容

    使用 ssl HTTPs 的网站示例 https www eb2a com 1 我尝试使用 file get contents 获取其内容 但不起作用并且给出错误 ex 2 我尝试使用 fopen 但不起作用并且给出错误 ex 3 我尝试使
  • SQL:动态变量名称

    我试图在存储过程中设置名称是动态的变量 DECLARE var01 varchar 50 DECLARE var02 varchar 50 DECLARE var30 varchar 50 DECLARE sql varchar max D
  • 如何使用 Three.js SSAO 着色器?

    我正在尝试使用 SSAO 后处理着色器渲染场景 没有任何错误 但我看不出使用和不使用 SSAO 通道渲染的场景有任何区别 我像这样初始化渲染器 Create WebGL Renderer var renderParameters antia
  • 如何读取#shadow-root(用户代理)下的文本

    我正在使用 Selenium Python 来自动化网页 我正在尝试从 shadow root 用户代理 下的输入字段获取文本 我使用的Xpath driver find element by xpath p calendar span i
  • 在 LINQ to Entities 中将字符串转换为 int?

    我必须转换一个string价值int 但 LINQ to Entities 似乎不支持这一点 对于以下代码 我收到错误 var query from p in dc CustomerBranch where p ID Convert ToI
  • 使用选项卡处理 Ionic 3 中的后退按钮

    This 问题及其答案 复制如下 提供了一个在 Ionic 中处理后退按钮的解决方案 但该解决方案仅在直接从其他页面推送时才有效app component 在这种情况下调用canGoBack and getActive on this na
  • Firebase检索当前子项然后将其设置为另一个Android子项的子项

    EDITED 我需要 Firebase 方面的帮助 我需要做的是 创建一个名为的新数据库引用Tokens 与客户和工人一致 并在代币下 根据当前用户的子级 例如木匠 管道工或电工 创建另一个新的数据库引用 当前代码 FirebaseData
  • 在删除包含指向自身在列表中位置的迭代器的节点时,vs2015 上的 stl 列表性能较差

    我只是存储一个节点列表 每个节点都包含一个指向其在列表中位置的迭代器 然后我对插入和删除 std 列表和 boost 列表节点所需的时间进行基准测试 Includes include