在 C++ 中push_back向量与在 C# 中添加到列表

push_back to vector in c++ vs add to list in c#

本文关键字:添加 列表 back C++ push 向量      更新时间:2023-10-16

我在 C++ 中有 1 个代码,在 c# 中有 1 个代码

应该强调的是,我只是测量了一个 .push-back 和一个 .add 周围的时间,对于它们的 10000 次出现,我写了所花费的时间。 所以其余的代码并不重要。我只是为了澄清而写的。

C++ 代码

void pv(int depth, m1* prevM1)
{
    if (depth == 0)
        return;
    vector <m1> *mList;
    if (prevM1->childM1 != 0)
        mList = prevMove->childM1;
    else 
    {
        mList = new vector<m1>;   
        f1 (mList);
    }
    for(vector<m1>::iterator it=mList.begin(); it !=m1.end(); ++it)
    {
         pv(depth - 1 ,it.chilM1);
    }
    prevM1->childM1 = mList;
}

void f1(vector<m1>* Moves)
{

我有一个计数器和一个时间,大约push_back,当它达到10000次时,我打印时间

    m1 obj;
    Moves->push_back(obj);

这里

    m1 obj2;
    Moves->push_back(obj2);
    m1 obj3;
    Moves->push_back(obj3);
    m1 obj4;
    Moves->push_back(obj4);
    m1 obj5;
    Moves->push_back(obj5);
    m1 obj6;
    Moves->push_back(obj6);
    m1 obj7;
    Moves->push_back(obj7);
    m1 obj8;
    Moves->push_back(obj8);
    m1 obj9;
    Moves->push_back(obj9);
    m1 obj10;
    Moves->push_back(obj10);
}

--------> 我在主

m1 move;
PV(10, &Moves);

C# 代码

m1 f1()
{
    List<m1> Moves = new List<m1>();

当它达到 10000 次时,我打印时间

    m1 obj = new m1();
    Moves.Add(obj);
/

/和这里

    m1 obj2 = new m1();
    Moves.Add(obj2);        
    m1 obj3 = new m1();
    Moves.Add(obj3);        
    m1 obj4 = new m1();
    Moves.Add(obj4);        
    m1 obj5 = new m1();
    Moves.Add(obj5);        
    m1 obj6 = new m1();
    Moves.Add(obj6);        
    m1 obj7 = new m1();
    Moves.Add(obj7);        
    m1 obj8 = new m1();
    Moves.Add(obj8);        
    m1 obj9 = new m1();
    Moves.Add(obj9);        
    m1 obj10 = new m1();
    Moves.Add(obj10);
    return Moves;    
}
void PV(int depth,m1 prevM1)
{
    List<m1> mList;
    if (depth == 0)
    {
        return;
    }
    if (prevMove.childM1 != null)
    {
        mList = prevMove.childM1;
    }
    else
    {
        mList = f1();
    }
    foreach(m1 move in mList)
    {
        pv(depth - 1, move);
    }

--------> 我在主

m1 move;
PV(10, move); 

M1 类在 C++ 和 C# 中都是相同的在 C# 中

class m1
{
    public String ms;
    public List<m1> childM1;
    public double d;
}

在 C++ 中

class m1
{
    public:
        string ms;
        m1* childM1;
        double d;
}
C# 中的代码在

12 毫秒内执行,但 C++ 中的代码在 143 毫秒内执行。我运行了很多时间来确定差异。C++ 中的代码至少比 C# 中的代码慢 10 倍。由于 C++ 中的向量与 C# 中的列表相同,似乎我错过了一些东西,所以我发现了这种差异。

任何帮助都将受到热烈欢迎。

最大的

区别是C++代码在每次循环迭代后都会销毁本地vector,从而释放push_back分配的内存。C#代码只是放弃了对本地List的引用,让垃圾回收器来处理它。这可能会使该循环更快,尽管程序完成的总工作量可能非常相似。

可能还有许多其他差异;您正在比较具有不同性能特征的两种不同语言。

C++是基于值的,即创建m1对象的副本。C# 是基于引用的,即存储对对象的引用。

也就是说,我认为您创建的性能测试并没有真正衡量任何东西!我可以想象任何一个编译器都可以检测到循环内没有真正完成任何操作并将其优化。更合理的测试是将元素添加到通过引用传递的容器(默认情况下,C# 传递指针,就可以了(到函数。

您的"等效"代码存在几个问题。

1(C++必须在区块结束时释放vector。C#可以继续滚动,并在程序生命周期结束时删除对象和列表

2(C++字符串和C#字符串是完全不同的东西。C++ 中的std::string是一个字符数组,可以存储任意长度的刺痛,并且必须分配/释放内存。C# string 是最有可能null的指针。