-1

我在 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);
}

--------> 我在 main 中执行这个

m1 move;
PV(10, &Moves);

c#代码

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

//我有一个计数器和一个围绕这个 Add 的时间。当它达到 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);
    }

--------> 我在 main 中执行这个

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# 中的 List 相同,所以我似乎遗漏了一些东西,所以我发现了这种差异。

任何帮助都将受到高度欢迎。

4

3 回答 3

4

最大的区别是 C++ 代码vector在每次循环迭代后破坏本地,释放由push_back. C# 代码只是放弃了对 local 的引用List,让垃圾收集器来处理它。尽管程序完成的工作总量可能非常相似,但这可能会使该循环更快。

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

于 2012-08-27T10:37:57.800 回答
3

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

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

于 2012-08-27T10:35:48.733 回答
1

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

1) C++ 必须vector在块的末尾解除分配。C# 可以继续滚动并在程序生命周期结束时删除对象和列表

2) C++ string and C# string are completely different things. The std::string in C++ is a array of chars which can store arbitrary length stings and has to allocate/deallocate memory. the C# string is a pointer which is most likely null.

于 2012-08-27T10:44:50.813 回答