Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 删除包含迭代器到self'的节点时,vs2015上的stl列表性能不佳;s在名单中的位置_C++_Performance_Boost_Visual Studio 2015_Stl_G++ - Fatal编程技术网

C++ 删除包含迭代器到self'的节点时,vs2015上的stl列表性能不佳;s在名单中的位置

C++ 删除包含迭代器到self'的节点时,vs2015上的stl列表性能不佳;s在名单中的位置,c++,performance,boost,visual-studio-2015,stl,g++,C++,Performance,Boost,Visual Studio 2015,Stl,G++,我只是存储一个节点列表,每个节点都包含一个指向其在列表中位置的迭代器。然后,我对插入和删除std列表和boost列表的节点所花费的时间进行基准测试。 包括 #include <iostream> #include <memory> #include <list> #include <chrono> #include "boost/container/list.hpp" #include "boost/shared_ptr.hpp" #inc

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

包括

#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
#包括
#包括
#包括
#包括
#包括“boost/container/list.hpp”
#包括“增压/共享_ptr.hpp”
#包括“boost/make_shared.hpp”
#定义十亿亿欧元
#定义一亿100000000
#定义一千万千万
#定义一百万
#定义10万
#定义一万
用于打印插入或删除的平均持续时间的帮助器函数

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;
}
void打印持续时间(std::ostream&out,const std::string&str,const std::chrono::高分辨率时钟::持续时间&d)
{

out当运行代码测试性能时,总是使用优化标志。我也有同样的问题,所以你不是第一个遇到这个问题的人


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

性能问题?使用a找出原因!您是如何编译的?在VS2015 x64 Debugger上为什么您还涉及
std::shared_ptr
vs
boost::shared_ptr
?MSVC调试模式将检查迭代器,这解释了为什么这种异常情况特别慢。@Abhi很好!不久前我还站在你的立场上,这就是为什么你得到了我的支持票(你问题中的另一个+1)。欢迎使用SO!:)另外,在VS2015中,即使是在发行版中,如果您在IDE中使用F5运行程序,它仍将使用调试堆,而“新建”和“释放”将花费更长的时间。如果您使用Ctrl-F5,它将使用正常堆运行程序。我有一个优化的程序,这样做可以将程序的速度提高5倍。@doug这就是我提到终端的原因!您不这么认为吗我应该根据你的评论更新我的答案吗?在终端cmd或bash中运行是很好的,但有时在IDE中更容易保持。这确实是一个风格问题。我刚才提到过,以防有人只是使用F5运行,并想知道为什么性能看起来很慢。
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;
}
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;
}