在 C++ 中push_back向量与在 C# 中添加到列表
push_back to vector in c++ vs add to list in c#
我在 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
的指针。
- 如何在 sqlite3 中的表中添加整数列表
- 有什么方法可以将元素添加到列表中,如图所示?
- 测试驱动开发 c++:如何将对象添加到向量中,将歌曲添加到播放列表并对其进行测试
- 将新元素添加到列表中,并返回对该元素的引用?
- 可视化 如何将 CString 值列表添加到 MFC C++ 中的组合框中?
- 通过在带有 C++ 的列表中添加连续元素来计算新的整数列表
- CSUF EPP - 你有什么想法(在添加到链接列表末尾时遇到麻烦)
- 将集合的随机元素添加到列表中,然后将其从原始集合中移除
- 如何使用LLVM C++API向保留节点列表添加
- 是否可以使用OpenMP并行化一个列表,该列表可以在每次迭代中添加新元素
- 如何确保我的节点被添加到链接列表中
- 如何读取文件的内容,如果文件中的单词重复,请将它们添加到列表中?
- 在 MFC 组合框中设置文本,而不将其添加到列表中
- 在C++中,如何将参数添加到"Args&&... args"参数列表中?
- C++将静态多态类自添加到子类的 constexpr 列表中
- 添加气泡排序代码以排列列表
- 双链接列表添加元素不起作用,不知何故它总是保持为空
- 如何从列表中将对象添加到图表中?
- 在运行时添加列表和从列表中删除
- MFC应用程序在添加列表控件元素时卡住