Sha*_*yna -1 c# c++ performance for-loop
我写了一个程序,它在 C++ 和 C# 中运行一个简单的 for 循环,但在 C# 中同样的事情花费的时间要长得多,这是为什么?我在测试中没有考虑到某些事情吗?
C# (13.95s)
static double timeStamp() {
return (double)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds;
}
static void Main(string[] args) {
double timeStart = timeStamp();
string f = "";
for(int i=0; i<100000; i++) {
f += "Sample";
}
double timeEnd = timeStamp();
double timeDelta = timeEnd - timeStart;
Console.WriteLine(timeDelta.ToString());
Console.Read();
}
Run Code Online (Sandbox Code Playgroud)
C++ (0.20s)
long int timeStampMS() {
milliseconds ms = duration_cast<milliseconds> (system_clock::now().time_since_epoch());
return ms.count();
}
int main() {
long int timeBegin = timeStampMS();
string test = "";
for (int i = 0; i < 100000; i++) {
test += "Sample";
}
long int timeEnd = timeStampMS();
long double delta = timeEnd - timeBegin;
cout << to_string(delta) << endl;
cin.get();
}
Run Code Online (Sandbox Code Playgroud)
在我的 PC 上,更改要使用的代码StringBuilder并String在最后转换为 a ,执行时间从 26.15 秒变为 0.0012 秒,或者快了 20,000 多倍。
var fb = new StringBuilder();
for (int i = 0; i < 100000; ++i) {
fb.Append("Sample");
}
var f = fb.ToString();
Run Code Online (Sandbox Code Playgroud)
正如 .Net 文档中所解释的,StringBuilder类是一个可变字符串对象,当您对字符串进行许多更改时非常有用,而不是String类,它是一个不可变对象,每次您都需要创建一个新对象将两个Strings连接在一起。由于实施StringBuilder是字符数组的链表,以及新的块加起来在同一时间8000个字符,StringBuilder.Append是要快得多。