对于我需要高速计算的新项目,我试图在C ++和C#之间进行选择。我总是听说C#速度合理。我知道C和C ++的速度比较慢,但我的例外是差异并不大!所以我用C ++和C#编写了两个代码来自己测试它们。
C ++的结果是5:09到5:55秒,C#的结果是11408到11960秒。
我的代码出了问题,或者这就是它的真实含义? 这是我的C ++代码:
clock_t tStart = clock();
std::ofstream myfile;
myfile.open("log.txt");
std::string pi;
int limit = 50;
for (int i = 0; i < limit; i++)
{
for (int j = 0; j < limit; j++)
{
for (int k = 0; k < limit; k++)
{
double val = sin(i *i + j *j + k *k);
pi = std::to_string(val);
myfile << pi<<"\n";
}
}
}
myfile.close();
printf("Time taken: %.2fs\n", (double)(clock() - tStart) / CLOCKS_PER_SEC);
getchar();
return 0;
这是我的C#代码:
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
string path = @"c:\log.txt";
int limit = 50;
for (int i = 0; i < limit; i++)
{
for (int j = 0; j < limit; j++)
{
for (int k = 0; k < limit; k++)
{
double val = Math.Sin(i *i + j *j + k *k);
using (StreamWriter sw = File.AppendText(path))
{
sw.WriteLine(val.ToString("F6"));
}
}
}
}
stopwatch.Stop();
Console.Write(stopwatch.ElapsedMilliseconds);
Console.ReadKey(true);
我的操作系统是Win7 64位。 提前感谢您的时间。
@EDIT:为什么要改变 double val = Math.Sin(i * i + j * j + k * k); 至 double val = Math.Sin(i ^ 2 + j ^ 2 + k ^ 2); 在C#中,会产生完全不同的答案吗?
答案 0 :(得分:3)
for (int j = 0; j < limit; j++)
{
for (int k = 0; k < limit; k++)
{
using (StreamWriter sw = File.AppendText(path))
{
//...
}
}
}
您的结果并不令人惊讶 - 您正在打开文件,并在每次迭代时创建和处置StreamWriter
。你应该创建一次:
using (StreamWriter sw = File.AppendText(path))
{
for (int j = 0; j < limit; j++)
{
for (int k = 0; k < limit; k++)
{
//...
}
}
}
答案 1 :(得分:2)
你的测试的最大区别在于,对于C ++,你打开并关闭循环外的文件,这意味着它只发生一次。
在C#测试中,您将打开文件,将文件搜索到最后,然后在每次迭代时关闭它。这将是一个巨大的时间下沉。
您应该将编写器的创建移动到循环上方,然后在退出循环后关闭它。
我正在引用代码
using (StreamWriter sw = File.AppendText(path))
{
sw.WriteLine(val.ToString("F6"));
}